1#ifndef PSPG_MIXTURE_TPP
2#define PSPG_MIXTURE_TPP
12#include <pspg/math/GpuResources.h>
54 for (i = 0; i < nPolymer(); ++i) {
55 for (j = 0; j < polymer(i).nBlock(); ++j) {
56 polymer(i).block(j).setDiscretization(ds_, mesh);
62 for (
int i = 0; i < nSolvent(); ++i) {
63 solvent(i).setDiscretization(mesh);
73 for (
int i = 0; i < nPolymer(); ++i) {
74 polymer(i).setupUnitCell(unitCell, wavelist);
86 monomer(monomerId).setKuhn(kuhn);
89 for (
int i = 0; i < nPolymer(); ++i) {
90 for (
int j = 0; j < polymer(i).nBlock(); ++j) {
91 if (monomerId == polymer(i).block(j).monomerId()) {
92 polymer(i).block(j).setKuhn(kuhn);
114 int nMesh = mesh().size();
119 int nBlocks, nThreads;
123 for (i = 0; i < nm; ++i) {
126 assignUniformReal<<<nBlocks, nThreads>>>(cFields[i].cDField(),
131 for (i = 0; i < nPolymer(); ++i) {
132 polymer(i).compute(wFields);
137 for (i = 0; i < nPolymer(); ++i) {
138 for (j = 0; j < polymer(i).nBlock(); ++j) {
139 monomerId = polymer(i).block(j).monomerId();
142 RDField<D>& monomerField = cFields[monomerId];
143 RDField<D>& blockField = polymer(i).block(j).cField();
145 pointWiseAdd<<<nBlocks, nThreads>>>(monomerField.
cDField(),
151 for (i = 0; i < nSolvent(); i++) {
152 monomerId = solvent(i).monomerId();
157 solvent(i).compute(wFields[monomerId]);
160 RDField<D>& monomerField = cFields[monomerId];
161 RDField<D> const & solventField = solvent(i).concField();
163 pointWiseAdd<<<nBlocks, nThreads>>>(monomerField.
cDField(),
182 for (i = 0; i < nPolymer(); ++i) {
183 polymer(i).computeStress(wavelist);
187 for (i = 0; i < nUnitCellParams_; ++i) {
189 for (j = 0; j < nPolymer(); ++j) {
190 stress_[i] += polymer(j).stress(i);
203 for (
int i = 0; i < nPolymer(); ++i) {
204 if (polymer(i).ensemble() == Species::Open) {
209 for (
int i = 0; i < nSolvent(); ++i) {
210 if (solvent(i).ensemble() == Species::Open) {
228 int np = nSolvent() + nBlock();
229 int nx = mesh().size();
232 UTIL_CHECK(blockCFields.capacity() == nBlock() + nSolvent());
235 int nBlocks, nThreads;
239 for (i = 0; i < np; ++i) {
241 assignUniformReal<<<nBlocks, nThreads>>>(blockCFields[i].cDField(), 0.0, nx);
247 if (nPolymer() > 0) {
250 for (i = 0; i < nPolymer(); ++i) {
251 for (j = 0; j < polymer(i).nBlock(); ++j) {
256 UTIL_CHECK(blockCFields[sectionId].capacity() == nx);
258 const cudaReal* blockField = polymer(i).block(j).cField().cDField();
259 cudaMemcpy(blockCFields[sectionId].cDField(), blockField,
260 mesh().size() *
sizeof(cudaReal), cudaMemcpyDeviceToDevice);
266 if (nSolvent() > 0) {
269 for (i = 0; i < nSolvent(); ++i) {
274 UTIL_CHECK(blockCFields[sectionId].capacity() == nx);
276 const cudaReal* solventField = solvent(i).concField().cDField();
277 cudaMemcpy(blockCFields[sectionId].cDField(), solventField,
278 mesh().size() *
sizeof(cudaReal), cudaMemcpyDeviceToDevice);
Description of a regular grid of points in a periodic domain.
A mixture of polymer and solvent species.
Solvent< D > Solvent
Solvent species solver typename.
Data * cDField()
Return pointer to underlying C array.
int capacity() const
Return allocated size.
void setKuhn(int monomerId, double kuhn)
Reset statistical segment length for one monomer type.
bool isCanonical()
Is the ensemble canonical (i.e, closed for all species)?
void readParameters(std::istream &in)
Read all parameters and initialize.
void setupUnitCell(UnitCell< D > const &unitCell, WaveList< D > const &waveList)
Set unit cell parameters used in solver.
void computeStress(WaveList< D > const &waveList)
Get monomer reference volume.
void compute(DArray< RDField< D > > const &wFields, DArray< RDField< D > > &cFields)
Compute concentrations.
void setMesh(Mesh< D > const &mesh)
Create an association with the mesh and allocate memory.
void createBlockCRGrid(DArray< RDField< D > > &blockCFields) const
Combine cFields for each block/solvent into one DArray.
Field of real single precision values on an FFT mesh on a device.
Container for wavevector data.
int nParameter() const
Get the number of parameters in the unit cell.
Base template for UnitCell<D> classes, D=1, 2 or 3.
Dynamically allocatable contiguous array template.
void setClassName(const char *className)
Set class name string.
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
void setThreadsLogical(int nThreadsLogical)
Set the total number of threads required for execution.
C++ namespace for polymer self-consistent field theory (PSCF).