Lattice Microbes 2.5
This is for whole cell modeling
Loading...
Searching...
No Matches
IntMpdRdmeSolver.h
Go to the documentation of this file.
1/*
2 * University of Illinois Open Source License
3 * Copyright 2008-2018 Luthey-Schulten Group,
4 * Copyright 2012 Roberts Group,
5 * All rights reserved.
6 *
7 * Developed by: Luthey-Schulten Group
8 * University of Illinois at Urbana-Champaign
9 * http://www.scs.uiuc.edu/~schulten
10 *
11 * Developed by: Roberts Group
12 * Johns Hopkins University
13 * http://biophysics.jhu.edu/roberts/
14 *
15 * Permission is hereby granted, free of charge, to any person obtaining a copy of
16 * this software and associated documentation files (the Software), to deal with
17 * the Software without restriction, including without limitation the rights to
18 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
19 * of the Software, and to permit persons to whom the Software is furnished to
20 * do so, subject to the following conditions:
21 *
22 * - Redistributions of source code must retain the above copyright notice,
23 * this list of conditions and the following disclaimers.
24 *
25 * - Redistributions in binary form must reproduce the above copyright notice,
26 * this list of conditions and the following disclaimers in the documentation
27 * and/or other materials provided with the distribution.
28 *
29 * - Neither the names of the Luthey-Schulten Group, University of Illinois at
30 * Urbana-Champaign, the Roberts Group, Johns Hopkins University, nor the names
31 * of its contributors may be used to endorse or promote products derived from
32 * this Software without specific prior written permission.
33 *
34 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
35 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
36 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
37 * THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
38 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
39 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
40 * OTHER DEALINGS WITH THE SOFTWARE.
41 *
42 * Author(s): Elijah Roberts, Zane Thornburg
43 */
44
45#ifndef LM_RDME_INTMPDRDMESOLVER_H_
46#define LM_RDME_INTMPDRDMESOLVER_H_
47
48#include "cuda/lm_cuda.h"
49#include "rdme/RDMESolver.h"
50#include "rdme/CudaIntLattice.h"
51
54
55namespace lm {
56
57namespace io {
58 class Lattice;
59 class SpeciesCounts;
60}
61
62namespace rdme {
63
65{
68
69public:
72
73 virtual void initialize(unsigned int replicate,
74 map<string, string>* parameters,
76
77 virtual bool needsReactionModel() {return true;}
78 virtual bool needsDiffusionModel() {return true;}
79
80 virtual void buildModel(const uint numberSpeciesA,
81 const uint numberReactionsA,
82 const uint* initialSpeciesCountsA,
83 const uint* reactionTypeA,
84 const double* kA,
85 const int* SA,
86 const uint* DA,
87 const uint kCols = 1);
88
89 virtual void buildDiffusionModel(const uint numberSiteTypesA,
90 const double* DFA,
91 const uint* RLA,
92 lattice_size_t latticeXSize,
93 lattice_size_t latticeYSize,
94 lattice_size_t latticeZSize,
95 site_size_t particlesPerSite,
96 const unsigned int bytes_per_particle,
97 si_dist_t latticeSpacing,
98 const uint8_t* latticeData,
99 const uint8_t* latticeSitesData,
100 bool rowMajorData = true);
101
102 virtual void generateTrajectory();
103 virtual void setReactionRate(unsigned int rxid, float rate);
104
105protected:
106 uint32_t seed;
107 double tau;
109
111 cudaStream_t cudaStream;
112
115
119
120#ifdef MPD_GLOBAL_S_MATRIX
121 uint8_t* RLG; // Device global memory pointer for RL matrix
122 int8_t* SG; // Device global memory pointer for S matrix
123#endif
124
125#ifdef MPD_GLOBAL_T_MATRIX
126 float* TG;
127#endif
128
129#ifdef MPD_GLOBAL_R_MATRIX
130 float* reactionRatesG;
131 unsigned int* reactionOrdersG;
132 unsigned int* reactionSitesG;
133
134 unsigned int* D1G;
135 unsigned int* D2G;
136#endif
137
141
142 virtual void allocateLattice(lattice_size_t latticeXSize,
143 lattice_size_t latticeYSize,
144 lattice_size_t latticeZSize,
145 site_size_t particlesPerSite,
146 const unsigned int bytes_per_particle,
147 si_dist_t latticeSpacing);
148
149 virtual void writeLatticeData(double time,
151 lm::io::Lattice* latticeDataSet);
152 virtual void writeLatticeSites(double time, CudaIntLattice* lattice);
153
154 virtual void recordSpeciesCounts(double time,
156 lm::io::SpeciesCounts* speciesCountsDataSet);
157 virtual void writeSpeciesCounts(lm::io::SpeciesCounts* speciesCountsDataSet);
158
159 virtual int hookSimulation(double time, CudaIntLattice* lattice);
160 virtual void hookCheckSimulation(double time, CudaIntLattice* lattice);
161
162 virtual void runTimestep(CudaIntLattice* lattice, uint32_t timestep);
163 virtual uint64_t getTimestepSeed(uint32_t timestep, uint32_t substep);
164
165 virtual void setLatticeData(const uint8_t* latticeData);
166 virtual void computePropensities();
167 virtual void copyModelsToDevice();
168
169#ifdef MPD_CUDA_3D_GRID_LAUNCH
170 virtual void calculateXLaunchParameters(dim3* gridSize, dim3* threadBlockSize,
171 const unsigned int maxXBlockSize,
172 const unsigned int latticeXSize,
173 const unsigned int latticeYSize,
174 const unsigned int latticeZSize);
175
176 virtual void calculateYLaunchParameters(dim3* gridSize, dim3* threadBlockSize,
177 const unsigned int blockXSize,
178 const unsigned int blockYSize,
179 const unsigned int latticeXSize,
180 const unsigned int latticeYSize,
181 const unsigned int latticeZSize);
182
183 virtual void calculateZLaunchParameters(dim3* gridSize, dim3* threadBlockSize,
184 const unsigned int blockXSize,
185 const unsigned int blockZSize,
186 const unsigned int latticeXSize,
187 const unsigned int latticeYSize,
188 const unsigned int latticeZSize);
189
190 virtual void calculateReactionLaunchParameters(dim3* gridSize, dim3* threadBlockSize,
191 const unsigned int blockXSize,
192 const unsigned int blockYSize,
193 const unsigned int latticeXSize,
194 const unsigned int latticeYSize,
195 const unsigned int latticeZSize);
196#else
197 virtual void calculateXLaunchParameters(unsigned int* gridXSize,
198 dim3* gridSize, dim3* threadBlockSize,
199 const unsigned int maxXBlockSize,
200 const unsigned int latticeXSize,
201 const unsigned int latticeYSize,
202 const unsigned int latticeZSize);
203
204 virtual void calculateYLaunchParameters(unsigned int* gridXSize,
205 dim3* gridSize, dim3* threadBlockSize,
206 const unsigned int blockXSize,
207 const unsigned int blockYSize,
208 const unsigned int latticeXSize,
209 const unsigned int latticeYSize,
210 const unsigned int latticeZSize);
211
212 virtual void calculateZLaunchParameters(unsigned int* gridXSize,
213 dim3* gridSize, dim3* threadBlockSize,
214 const unsigned int blockXSize,
215 const unsigned int blockZSize,
216 const unsigned int latticeXSize,
217 const unsigned int latticeYSize,
218 const unsigned int latticeZSize);
219
220 virtual void calculateReactionLaunchParameters(unsigned int* gridXSize,
221 dim3* gridSize, dim3* threadBlockSize,
222 const unsigned int blockXSize,
223 const unsigned int blockYSize,
224 const unsigned int latticeXSize,
225 const unsigned int latticeYSize,
226 const unsigned int latticeZSize);
227#endif
228};
229
230
231namespace intmpdrdme_dev {
232
233#ifdef MPD_FREAKYFAST
234 #ifdef MPD_GLOBAL_R_MATRIX
235 __global__ void precomp_reaction_kernel(const unsigned int* inLattice,
236 const uint8_t* inSites,
237 unsigned int* outLattice,
238 const unsigned long long timestepHash,
239 unsigned int* siteOverflowList,
240 const __restrict__ int8_t* SG,
241 const __restrict__ uint8_t* RLG,
242 const unsigned int* __restrict__ reactionOrdersG,
243 const unsigned int* __restrict__ reactionSitesG,
244 const unsigned int* __restrict__ D1G,
245 const unsigned int* __restrict__ D2G,
246 const float* reactionRatesG,
247 const float* __restrict__ qp0,
248 const float* __restrict__ qp1,
249 const float* __restrict__ qp2);
250 #else
251 __global__ void precomp_reaction_kernel(const unsigned int* inLattice,
252 const uint8_t* inSites,
253 unsigned int* outLattice,
254 const unsigned long long timestepHash,
255 unsigned int* siteOverflowList,
256 const __restrict__ int8_t* SG,
257 const __restrict__ uint8_t* RLG,
258 const float* __restrict__ qp0,
259 const float* __restrict__ qp1,
260 const float* __restrict__ qp2);
261 #endif
262#endif
263
264#ifdef MPD_CUDA_3D_GRID_LAUNCH
265 __global__ void mpd_x_kernel(const unsigned int* inLattice,
266 const uint8_t* inSites,
267 unsigned int* outLattice,
268 const unsigned long long timestepHash,
269 unsigned int* siteOverflowList);
270
271 __global__ void mpd_y_kernel(const unsigned int* inLattice,
272 const uint8_t* inSites,
273 unsigned int* outLattice,
274 const unsigned long long timestepHash,
275 unsigned int* siteOverflowList);
276
277 __global__ void mpd_z_kernel(const unsigned int* inLattice,
278 const uint8_t* inSites,
279 unsigned int* outLattice,
280 const unsigned long long timestepHash,
281 unsigned int* siteOverflowList);
282
283 #ifdef MPD_GLOBAL_S_MATRIX
284 #ifdef MPD_GLOBAL_R_MATRIX
285 __global__ void reaction_kernel(const unsigned int* inLattice,
286 const uint8_t* inSites,
287 unsigned int* outLattice,
288 const unsigned long long timestepHash,
289 unsigned int* siteOverflowList,
290 const int8_t* __restrict__ SG,
291 const uint8_t* __restrict__ RLG,
292 const unsigned int* __restrict__ reactionOrdersG,
293 const unsigned int* __restrict__ reactionSitesG,
294 const unsigned int* __restrict__ D1G,
295 const unsigned int* __restrict__ D2G,
296 const float* __restrict__ reactionRatesG);
297 #else
298 __global__ void reaction_kernel(const unsigned int* inLattice,
299 const uint8_t* inSites,
300 unsigned int* outLattice,
301 const unsigned long long timestepHash,
302 unsigned int* siteOverflowList,
303 const int8_t* __restrict__ SG,
304 const uint8_t* __restrict__ RLG);
305 #endif
306 #else
307 __global__ void reaction_kernel(const unsigned int* inLattice,
308 const uint8_t* inSites,
309 unsigned int* outLattice,
310 const unsigned long long timestepHash,
311 unsigned int* siteOverflowList);
312 #endif
313#else
314 __global__ void mpd_x_kernel(const unsigned int* inLattice,
315 const uint8_t* inSites,
316 unsigned int* outLattice,
317 const unsigned int gridXSize,
318 const unsigned long long timestepHash,
319 unsigned int* siteOverflowList);
320
321 __global__ void mpd_y_kernel(const unsigned int* inLattice,
322 const uint8_t* inSites,
323 unsigned int* outLattice,
324 const unsigned int gridXSize,
325 const unsigned long long timestepHash,
326 unsigned int* siteOverflowList);
327
328 __global__ void mpd_z_kernel(const unsigned int* inLattice,
329 const uint8_t* inSites,
330 unsigned int* outLattice,
331 const unsigned int gridXSize,
332 const unsigned long long timestepHash,
333 unsigned int* siteOverflowList);
334
335 #ifdef MPD_GLOBAL_S_MATRIX
336 #ifdef MPD_GLOBAL_R_MATRIX
337 __global__ void reaction_kernel(const unsigned int* inLattice,
338 const uint8_t* inSites,
339 unsigned int* outLattice,
340 const unsigned int gridXSize,
341 const unsigned long long timestepHash,
342 unsigned int* siteOverflowList,
343 const int8_t* __restrict__ SG,
344 const uint8_t* __restrict__ RLG,
345 const unsigned int* __restrict__ reactionOrdersG,
346 const unsigned int* __restrict__ reactionSitesG,
347 const unsigned int* __restrict__ D1G,
348 const unsigned int* __restrict__ D2G,
349 const float* __restrict__ reactionRatesG);
350 #else
351 __global__ void reaction_kernel(const unsigned int* inLattice,
352 const uint8_t* inSites,
353 unsigned int* outLattice,
354 const unsigned int gridXSize,
355 const unsigned long long timestepHash,
356 unsigned int* siteOverflowList,
357 const int8_t* __restrict__ SG,
358 const uint8_t* __restrict__ RLG);
359 #endif
360 #else
361 __global__ void reaction_kernel(const unsigned int* inLattice,
362 const uint8_t* inSites,
363 unsigned int* outLattice,
364 const unsigned int gridXSize,
365 const unsigned long long timestepHash,
366 unsigned int* siteOverflowList);
367 #endif
368#endif
369
370}
371}
372}
373
374#endif
uint32_t site_size_t
Definition ByteLatticeExtended.h:23
uint32_t lattice_size_t
Definition Lattice.h:55
double si_dist_t
Definition Types.h:63
unsigned int uint
Definition Types.h:52
virtual int hookSimulation(double time)
Definition CMESolver.cpp:1242
A representation for the resources for a given node.
Definition ResourceAllocator.h:62
map< string, string > * parameters
Definition CMESolver.h:266
ResourceAllocator::ComputeResources * resources
Definition CMESolver.h:267
unsigned int replicate
Definition CMESolver.h:265
Definition CudaIntLattice.h:54
virtual void writeSpeciesCounts(lm::io::SpeciesCounts *speciesCountsDataSet)
virtual bool needsReactionModel()
Tells whether the solver needs a reaction model.
Definition IntMpdRdmeSolver.h:77
size_t firstOrderSize
Definition IntMpdRdmeSolver.h:117
float * propFirstOrder
Definition IntMpdRdmeSolver.h:139
virtual void allocateLattice(lattice_size_t latticeXSize, lattice_size_t latticeYSize, lattice_size_t latticeZSize, site_size_t particlesPerSite, const unsigned int bytes_per_particle, si_dist_t latticeSpacing)
float * propZeroOrder
Definition IntMpdRdmeSolver.h:138
uint32_t overflowTimesteps
Definition IntMpdRdmeSolver.h:113
size_t zeroOrderSize
Definition IntMpdRdmeSolver.h:117
virtual void calculateReactionLaunchParameters(unsigned int *gridXSize, dim3 *gridSize, dim3 *threadBlockSize, const unsigned int blockXSize, const unsigned int blockYSize, const unsigned int latticeXSize, const unsigned int latticeYSize, const unsigned int latticeZSize)
virtual void setLatticeData(const uint8_t *latticeData)
virtual void copyModelsToDevice()
virtual void calculateYLaunchParameters(unsigned int *gridXSize, dim3 *gridSize, dim3 *threadBlockSize, const unsigned int blockXSize, const unsigned int blockYSize, const unsigned int latticeXSize, const unsigned int latticeYSize, const unsigned int latticeZSize)
virtual void runTimestep(CudaIntLattice *lattice, uint32_t timestep)
size_t secondOrderSize
Definition IntMpdRdmeSolver.h:117
virtual void setReactionRate(unsigned int rxid, float rate)
uint32_t overflowListUses
Definition IntMpdRdmeSolver.h:114
void * cudaOverflowList
Definition IntMpdRdmeSolver.h:110
uint32_t seed
Definition IntMpdRdmeSolver.h:106
virtual void writeLatticeSites(double time, CudaIntLattice *lattice)
virtual uint64_t getTimestepSeed(uint32_t timestep, uint32_t substep)
cudaStream_t cudaStream
Definition IntMpdRdmeSolver.h:111
virtual void buildModel(const uint numberSpeciesA, const uint numberReactionsA, const uint *initialSpeciesCountsA, const uint *reactionTypeA, const double *kA, const int *SA, const uint *DA, const uint kCols=1)
virtual void calculateXLaunchParameters(unsigned int *gridXSize, dim3 *gridSize, dim3 *threadBlockSize, const unsigned int maxXBlockSize, const unsigned int latticeXSize, const unsigned int latticeYSize, const unsigned int latticeZSize)
float * zeroOrder
Definition IntMpdRdmeSolver.h:118
virtual void writeLatticeData(double time, CudaIntLattice *lattice, lm::io::Lattice *latticeDataSet)
float * secondOrder
Definition IntMpdRdmeSolver.h:118
float * propSecondOrder
Definition IntMpdRdmeSolver.h:140
virtual int hookSimulation(double time, CudaIntLattice *lattice)
float * firstOrder
Definition IntMpdRdmeSolver.h:118
virtual void buildDiffusionModel(const uint numberSiteTypesA, const double *DFA, const uint *RLA, lattice_size_t latticeXSize, lattice_size_t latticeYSize, lattice_size_t latticeZSize, site_size_t particlesPerSite, const unsigned int bytes_per_particle, si_dist_t latticeSpacing, const uint8_t *latticeData, const uint8_t *latticeSitesData, bool rowMajorData=true)
virtual void computePropensities()
virtual void initialize(unsigned int replicate, map< string, string > *parameters, ResourceAllocator::ComputeResources *resources)
Initialize the simulation.
virtual void recordSpeciesCounts(double time, CudaIntLattice *lattice, lm::io::SpeciesCounts *speciesCountsDataSet)
double tau
Definition IntMpdRdmeSolver.h:107
virtual void hookCheckSimulation(double time, CudaIntLattice *lattice)
virtual bool needsDiffusionModel()
Tells whether the solver needs a reaction model.
Definition IntMpdRdmeSolver.h:78
virtual void generateTrajectory()
Actually run the simulation.
float * model_reactionRates
Definition IntMpdRdmeSolver.h:116
virtual void calculateZLaunchParameters(unsigned int *gridXSize, dim3 *gridSize, dim3 *threadBlockSize, const unsigned int blockXSize, const unsigned int blockZSize, const unsigned int latticeXSize, const unsigned int latticeYSize, const unsigned int latticeZSize)
bool reactionModelModified
Definition IntMpdRdmeSolver.h:108
Base class for lattice type objects.
Definition Lattice.h:132
Definition RDMESolver.h:55
Lattice * lattice
Definition RDMESolver.h:73
virtual void buildDiffusionModel(const uint numberSiteTypesA, const double *DFA, const uint *RLA, lattice_size_t latticeXSize, lattice_size_t latticeYSize, lattice_size_t latticeZSize, site_size_t particlesPerSite, const unsigned int bytes_per_particle, si_dist_t latticeSpacing, const uint8_t *latticeData, const uint8_t *latticeSitesData, bool rowMajorData=true)
Definition RDMESolver.cpp:110
RDMESolver(RandomGenerator::Distributions neededDists)
Definition RDMESolver.cpp:58
Definition LatticeBuilder.h:56
Definition IntMpdRdmeSolver.h:231
__global__ void mpd_z_kernel(const unsigned int *inLattice, const uint8_t *inSites, unsigned int *outLattice, const unsigned int gridXSize, const unsigned long long timestepHash, unsigned int *siteOverflowList)
__global__ void reaction_kernel(const unsigned int *inLattice, const uint8_t *inSites, unsigned int *outLattice, const unsigned int gridXSize, const unsigned long long timestepHash, unsigned int *siteOverflowList)
__global__ void mpd_x_kernel(const unsigned int *inLattice, const uint8_t *inSites, unsigned int *outLattice, const unsigned int gridXSize, const unsigned long long timestepHash, unsigned int *siteOverflowList)
__global__ void mpd_y_kernel(const unsigned int *inLattice, const uint8_t *inSites, unsigned int *outLattice, const unsigned int gridXSize, const unsigned long long timestepHash, unsigned int *siteOverflowList)
Definition LatticeBuilder.h:60
Definition Capsule.cpp:46