Lattice Microbes 2.5
This is for whole cell modeling
Loading...
Searching...
No Matches
MpdRdmeSolver.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_MPDRDMESOLVER_H_
46#define LM_RDME_MPDRDMESOLVER_H_
47
48#include "cuda/lm_cuda.h"
49#include "rdme/RDMESolver.h"
51
52#define OVERFLOW_MODE_CLASSIC 0
53#define OVERFLOW_MODE_RELAXED 1
54
57
58namespace lm {
59
60namespace io {
61 class Lattice;
62 class SpeciesCounts;
63}
64
65namespace rdme {
66
68{
73
74public:
76 virtual ~MpdRdmeSolver();
77
78 virtual void initialize(unsigned int replicate,
79 map<string, string>* parameters,
81
82 virtual bool needsReactionModel() {return true;}
83 virtual bool needsDiffusionModel() {return true;}
84
85 virtual void buildModel(const uint numberSpeciesA,
86 const uint numberReactionsA,
87 const uint* initialSpeciesCountsA,
88 const uint* reactionTypeA,
89 const double* kA,
90 const int* SA,
91 const uint* DA,
92 const uint kCols = 1);
93
94 virtual void buildDiffusionModel(const uint numberSiteTypesA,
95 const double* DFA,
96 const uint* RLA,
97 lattice_size_t latticeXSize,
98 lattice_size_t latticeYSize,
99 lattice_size_t latticeZSize,
100 site_size_t particlesPerSite,
101 const unsigned int bytes_per_particle,
102 si_dist_t latticeSpacing,
103 const uint8_t* latticeData,
104 const uint8_t* latticeSitesData,
105 bool rowMajorData = true);
106
107 virtual void generateTrajectory();
108 virtual void setReactionRate(unsigned int rxid, float rate);
109
110protected:
111 uint32_t seed;
112 double tau;
114
116 cudaStream_t cudaStream;
117
121
125
126#ifdef MPD_GLOBAL_S_MATRIX
127 uint8_t* RLG; // Device global memory pointer for RL matrix
128 int8_t* SG; // Device global memory pointer for S matrix
129#endif
130
131#ifdef MPD_GLOBAL_T_MATRIX
132 float* TG;
133#endif
134
135#ifdef MPD_GLOBAL_R_MATRIX
136 float* reactionRatesG;
137 unsigned int* reactionOrdersG;
138 unsigned int* reactionSitesG;
139
140 unsigned int* D1G;
141 unsigned int* D2G;
142#endif
143
147
150 virtual int onWriteLattice(double time, CudaByteLattice* lattice);
151
152 virtual void allocateLattice(lattice_size_t latticeXSize,
153 lattice_size_t latticeYSize,
154 lattice_size_t latticeZSize,
155 site_size_t particlesPerSite,
156 const unsigned int bytes_per_particle,
157 si_dist_t latticeSpacing);
158
159 virtual void writeLatticeData(double time,
161 lm::io::Lattice* latticeDataSet);
162 virtual void writeLatticeSites(double time, CudaByteLattice* lattice);
163
164 virtual void recordSpeciesCounts(double time,
166 lm::io::SpeciesCounts* speciesCountsDataSet);
167 virtual void writeSpeciesCounts(lm::io::SpeciesCounts* speciesCountsDataSet);
168
169 virtual int hookSimulation(double time, CudaByteLattice* lattice);
170 virtual void hookCheckSimulation(double time, CudaByteLattice* lattice);
171
172 virtual void runTimestep(CudaByteLattice* lattice, uint32_t timestep);
173 virtual uint64_t getTimestepSeed(uint32_t timestep, uint32_t substep);
174
175 virtual void computePropensities();
176 virtual void copyModelsToDevice();
177
178#ifdef MPD_CUDA_3D_GRID_LAUNCH
179 virtual void calculateXLaunchParameters(dim3* gridSize, dim3* threadBlockSize,
180 const unsigned int maxXBlockSize,
181 const unsigned int latticeXSize,
182 const unsigned int latticeYSize,
183 const unsigned int latticeZSize);
184
185 virtual void calculateYLaunchParameters(dim3* gridSize, dim3* threadBlockSize,
186 const unsigned int blockXSize,
187 const unsigned int blockYSize,
188 const unsigned int latticeXSize,
189 const unsigned int latticeYSize,
190 const unsigned int latticeZSize);
191
192 virtual void calculateZLaunchParameters(dim3* gridSize, dim3* threadBlockSize,
193 const unsigned int blockXSize,
194 const unsigned int blockZSize,
195 const unsigned int latticeXSize,
196 const unsigned int latticeYSize,
197 const unsigned int latticeZSize);
198
199 virtual void calculateReactionLaunchParameters(dim3* gridSize, dim3* threadBlockSize,
200 const unsigned int blockXSize,
201 const unsigned int blockYSize,
202 const unsigned int latticeXSize,
203 const unsigned int latticeYSize,
204 const unsigned int latticeZSize);
205#else
206 virtual void calculateXLaunchParameters(unsigned int* gridXSize,
207 dim3* gridSize, dim3* threadBlockSize,
208 const unsigned int maxXBlockSize,
209 const unsigned int latticeXSize,
210 const unsigned int latticeYSize,
211 const unsigned int latticeZSize);
212
213 virtual void calculateYLaunchParameters(unsigned int* gridXSize,
214 dim3* gridSize, dim3* threadBlockSize,
215 const unsigned int blockXSize,
216 const unsigned int blockYSize,
217 const unsigned int latticeXSize,
218 const unsigned int latticeYSize,
219 const unsigned int latticeZSize);
220
221 virtual void calculateZLaunchParameters(unsigned int* gridXSize,
222 dim3* gridSize, dim3* threadBlockSize,
223 const unsigned int blockXSize,
224 const unsigned int blockZSize,
225 const unsigned int latticeXSize,
226 const unsigned int latticeYSize,
227 const unsigned int latticeZSize);
228
229 virtual void calculateReactionLaunchParameters(unsigned int* gridXSize,
230 dim3* gridSize, dim3* threadBlockSize,
231 const unsigned int blockXSize,
232 const unsigned int blockYSize,
233 const unsigned int latticeXSize,
234 const unsigned int latticeYSize,
235 const unsigned int latticeZSize);
236#endif
237
238};
239
240
241namespace mpdrdme_dev {
242
243#ifdef MPD_FREAKYFAST
244 #ifdef MPD_GLOBAL_R_MATRIX
245 __global__ void precomp_reaction_kernel(const unsigned int* inLattice,
246 const uint8_t* inSites,
247 unsigned int* outLattice,
248 const unsigned long long timestepHash,
249 unsigned int* siteOverflowList,
250 const __restrict__ int8_t* SG,
251 const __restrict__ uint8_t* RLG,
252 const unsigned int* __restrict__ reactionOrdersG,
253 const unsigned int* __restrict__ reactionSitesG,
254 const unsigned int* __restrict__ D1G,
255 const unsigned int* __restrict__ D2G,
256 const float* reactionRatesG,
257 const float* __restrict__ qp0,
258 const float* __restrict__ qp1,
259 const float* __restrict__ qp2);
260 #else
261 __global__ void precomp_reaction_kernel(const unsigned int* inLattice,
262 const uint8_t* inSites,
263 unsigned int* outLattice,
264 const unsigned long long timestepHash,
265 unsigned int* siteOverflowList,
266 const __restrict__ int8_t* SG,
267 const __restrict__ uint8_t* RLG,
268 const float* __restrict__ qp0,
269 const float* __restrict__ qp1,
270 const float* __restrict__ qp2);
271 #endif
272#endif
273
274#ifdef MPD_CUDA_3D_GRID_LAUNCH
275 __global__ void mpd_x_kernel(const unsigned int* inLattice,
276 const uint8_t* inSites,
277 unsigned int* outLattice,
278 const unsigned long long timestepHash,
279 unsigned int* siteOverflowList);
280
281 __global__ void mpd_y_kernel(const unsigned int* inLattice,
282 const uint8_t* inSites,
283 unsigned int* outLattice,
284 const unsigned long long timestepHash,
285 unsigned int* siteOverflowList);
286
287 __global__ void mpd_z_kernel(const unsigned int* inLattice,
288 const uint8_t* inSites,
289 unsigned int* outLattice,
290 const unsigned long long timestepHash,
291 unsigned int* siteOverflowList);
292
293 #ifdef MPD_GLOBAL_S_MATRIX
294 #ifdef MPD_GLOBAL_R_MATRIX
295 __global__ void reaction_kernel(const unsigned int* inLattice,
296 const uint8_t* inSites,
297 unsigned int* outLattice,
298 const unsigned long long timestepHash,
299 unsigned int* siteOverflowList,
300 const int8_t* __restrict__ SG,
301 const uint8_t* __restrict__ RLG,
302 const unsigned int* __restrict__ reactionOrdersG,
303 const unsigned int* __restrict__ reactionSitesG,
304 const unsigned int* __restrict__ D1G,
305 const unsigned int* __restrict__ D2G,
306 const float* __restrict__ reactionRatesG);
307 #else
308 __global__ void reaction_kernel(const unsigned int* inLattice,
309 const uint8_t* inSites,
310 unsigned int* outLattice,
311 const unsigned long long timestepHash,
312 unsigned int* siteOverflowList,
313 const int8_t* __restrict__ SG,
314 const uint8_t* __restrict__ RLG);
315 #endif
316 #else
317 __global__ void reaction_kernel(const unsigned int* inLattice,
318 const uint8_t* inSites,
319 unsigned int* outLattice,
320 const unsigned long long timestepHash,
321 unsigned int* siteOverflowList);
322 #endif
323#else
324 __global__ void mpd_x_kernel(const unsigned int* inLattice,
325 const uint8_t* inSites,
326 unsigned int* outLattice,
327 const unsigned int gridXSize,
328 const unsigned long long timestepHash,
329 unsigned int* siteOverflowList);
330
331 __global__ void mpd_y_kernel(const unsigned int* inLattice,
332 const uint8_t* inSites,
333 unsigned int* outLattice,
334 const unsigned int gridXSize,
335 const unsigned long long timestepHash,
336 unsigned int* siteOverflowList);
337
338 __global__ void mpd_z_kernel(const unsigned int* inLattice,
339 const uint8_t* inSites,
340 unsigned int* outLattice,
341 const unsigned int gridXSize,
342 const unsigned long long timestepHash,
343 unsigned int* siteOverflowList);
344
345 #ifdef MPD_GLOBAL_S_MATRIX
346 #ifdef MPD_GLOBAL_R_MATRIX
347 __global__ void reaction_kernel(const unsigned int* inLattice,
348 const uint8_t* inSites,
349 unsigned int* outLattice,
350 const unsigned int gridXSize,
351 const unsigned long long timestepHash,
352 unsigned int* siteOverflowList,
353 const int8_t* __restrict__ SG,
354 const uint8_t* __restrict__ RLG,
355 const unsigned int* __restrict__ reactionOrdersG,
356 const unsigned int* __restrict__ reactionSitesG,
357 const unsigned int* __restrict__ D1G,
358 const unsigned int* __restrict__ D2G,
359 const float* __restrict__ reactionRatesG);
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 const int8_t* __restrict__ SG,
368 const uint8_t* __restrict__ RLG);
369 #endif
370 #else
371 __global__ void reaction_kernel(const unsigned int* inLattice,
372 const uint8_t* inSites,
373 unsigned int* outLattice,
374 const unsigned int gridXSize,
375 const unsigned long long timestepHash,
376 unsigned int* siteOverflowList);
377 #endif
378#endif
379
380__global__ void correct_overflows(unsigned int* inLattice, unsigned int* siteOverflowList);
381__global__ void correct_overflowsEV(unsigned int* inLattice, const float* evData, unsigned int* siteOverflowList);
382__global__ void sanity_check(const unsigned int* L1, const unsigned int* L2);
383
384}
385}
386}
387
388#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 onEndTrajectory()
Definition CMESolver.cpp:1256
virtual int hookSimulation(double time)
Definition CMESolver.cpp:1242
virtual int onBeginTrajectory()
Definition CMESolver.cpp:1251
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 CudaByteLattice.h:54
Base class for lattice type objects.
Definition Lattice.h:132
size_t firstOrderSize
Definition MpdRdmeSolver.h:123
virtual void writeSpeciesCounts(lm::io::SpeciesCounts *speciesCountsDataSet)
double tau
Definition MpdRdmeSolver.h:112
uint32_t overflowListUses
Definition MpdRdmeSolver.h:119
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 generateTrajectory()
Actually run the simulation.
virtual void initialize(unsigned int replicate, map< string, string > *parameters, ResourceAllocator::ComputeResources *resources)
Initialize the simulation.
float * secondOrder
Definition MpdRdmeSolver.h:124
virtual void copyModelsToDevice()
virtual bool needsDiffusionModel()
Tells whether the solver needs a reaction model.
Definition MpdRdmeSolver.h:83
float * firstOrder
Definition MpdRdmeSolver.h:124
virtual int onWriteLattice(double time, CudaByteLattice *lattice)
int overflow_handling
Definition MpdRdmeSolver.h:120
virtual void hookCheckSimulation(double time, CudaByteLattice *lattice)
float * zeroOrder
Definition MpdRdmeSolver.h:124
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 int onEndTrajectory(CudaByteLattice *lattice)
virtual void recordSpeciesCounts(double time, CudaByteLattice *lattice, lm::io::SpeciesCounts *speciesCountsDataSet)
uint32_t seed
Definition MpdRdmeSolver.h:111
virtual int onBeginTrajectory(CudaByteLattice *lattice)
float * model_reactionRates
Definition MpdRdmeSolver.h:122
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)
size_t secondOrderSize
Definition MpdRdmeSolver.h:123
float * propFirstOrder
Definition MpdRdmeSolver.h:145
virtual int hookSimulation(double time, CudaByteLattice *lattice)
uint32_t overflowTimesteps
Definition MpdRdmeSolver.h:118
cudaStream_t cudaStream
Definition MpdRdmeSolver.h:116
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)
bool reactionModelModified
Definition MpdRdmeSolver.h:113
size_t zeroOrderSize
Definition MpdRdmeSolver.h:123
virtual void runTimestep(CudaByteLattice *lattice, uint32_t timestep)
float * propZeroOrder
Definition MpdRdmeSolver.h:144
virtual void setReactionRate(unsigned int rxid, float rate)
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)
virtual void writeLatticeSites(double time, CudaByteLattice *lattice)
float * propSecondOrder
Definition MpdRdmeSolver.h:146
void * cudaOverflowList
Definition MpdRdmeSolver.h:115
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 writeLatticeData(double time, CudaByteLattice *lattice, lm::io::Lattice *latticeDataSet)
virtual void computePropensities()
virtual uint64_t getTimestepSeed(uint32_t timestep, uint32_t substep)
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 bool needsReactionModel()
Tells whether the solver needs a reaction model.
Definition MpdRdmeSolver.h:82
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 MpdRdmeSolver.h:241
__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 sanity_check(const unsigned int *L1, const unsigned int *L2)
__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)
__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 correct_overflowsEV(unsigned int *inLattice, const float *evData, unsigned int *siteOverflowList)
__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 correct_overflows(unsigned int *inLattice, unsigned int *siteOverflowList)
Definition Capsule.cpp:46