Tutorial 3
Linear Diffusion


Overview Image

Numerical Results


 

 This setup introduces the use of checkpointing. Ligands originally diffuse within a central box, then diffuse out when the checkpoint is reached, and are counted by the sampling boxes located outside of the original box.

file input_1
/* linear_diffusion_1 */

dt = 0.5e-6     iterations = 5000       chkpt_iterations = 2000
D = 6.0e-6      n = 1000

TIME_STEP = dt
ITERATIONS = iterations

PARTITION_X = [-2.55,-2.25,-1.95,-1.65,-1.35,-1.05,-0.75,-0.45,-0.15,
0.15,0.45,0.75,1.05,1.35,1.65,1.95,2.25,2.55]

CHECKPOINT_INFILE = "chkpt"
CHECKPOINT_OUTFILE = "chkpt"
CHECKPOINT_ITERATIONS = chkpt_iterations

DEFINE_LIGAND A {DIFFUSION_CONSTANT = D}

y_value_1 = -1.0                        y_value_2 = 1.0
z_value_1 = -1.0                        z_value_2 = 1.0
ll1 = [-10.0,y_value_1,z_value_1]        ur1 = [10.0,y_value_2,z_value_2]
ll2 = [-0.015,y_value_1,z_value_1]       ur2 = [0.015,y_value_2,z_value_2]
offset = .05
ll3 = [-offset,y_value_1,z_value_1]      ur3 = [offset,y_value_2,z_value_2]

sampling_template BOX {
        CORNERS = ll3,ur3
        FULLY_CLOSED = YES
        TRANSPARENT {LIGAND = A   ELEMENT = ALL_ELEMENTS}
        REMOVE_ELEMENT = TOP
        REMOVE_ELEMENT = BOTTOM
        REMOVE_ELEMENT = FRONT
        REMOVE_ELEMENT = BACK
}

INSTANTIATE microdomain OBJECT {
        release_site SPHERICAL_RELEASE_SITE {
                LOCATION = [0,0,0]
                LIGAND = A
                NUMBER_TO_RELEASE = n
                SITE_DIAMETER = 0.03
        }
        bounding_walls BOX {
                CORNERS = ll1,ur1
                FULLY_CLOSED = YES
                ABSORPTIVE {LIGAND = A   ELEMENT = LEFT}
                ABSORPTIVE {LIGAND = A  ELEMENT = RIGHT}
        }
        center_box BOX {
                CORNERS = ll2,ur2
                FULLY_CLOSED = YES
                REFLECTIVE {LIGAND = A   ELEMENT = ALL_ELEMENTS}
                REMOVE_ELEMENT = TOP
                REMOVE_ELEMENT = BOTTOM
                REMOVE_ELEMENT = FRONT
                REMOVE_ELEMENT = BACK
        }
        sampling_boxes OBJECT {
                left_1 OBJECT sampling_template {TRANSLATE = [-0.3,0,0]}
                left_2 OBJECT sampling_template {TRANSLATE = [-0.6,0,0]}
                left_3 OBJECT sampling_template {TRANSLATE = [-0.9,0,0]}
                left_4 OBJECT sampling_template {TRANSLATE = [-1.2,0,0]}
                left_5 OBJECT sampling_template {TRANSLATE = [-1.5,0,0]}
                left_6 OBJECT sampling_template {TRANSLATE = [-1.8,0,0]}
                left_7 OBJECT sampling_template {TRANSLATE = [-2.1,0,0]}
                left_8 OBJECT sampling_template {TRANSLATE = [-2.4,0,0]}
                right_1 OBJECT sampling_template {TRANSLATE = [0.3,0,0]}
                right_2 OBJECT sampling_template {TRANSLATE = [0.6,0,0]}
                right_3 OBJECT sampling_template {TRANSLATE = [0.9,0,0]}
                right_4 OBJECT sampling_template {TRANSLATE = [1.2,0,0]}
                right_5 OBJECT sampling_template {TRANSLATE = [1.5,0,0]}
                right_6 OBJECT sampling_template {TRANSLATE = [1.8,0,0]}
                right_7 OBJECT sampling_template {TRANSLATE = [2.1,0,0]}
                right_8 OBJECT sampling_template {TRANSLATE = [2.4,0,0]}
        }
}

/*
VIZ_DATA_OUTPUT {
        MODE = DX
        STATE_VALUES {
                A = 1  
                microdomain.bounding_walls = 2
                microdomain.center_box = 3
                microdomain.sampling_boxes = 4
        }
        OBJECT_FILE_DESIGNATORS {
                microdomain.bounding_walls = "bounding_walls"
                microdomain.center_box = "center_box"
                microdomain.sampling_boxes = "sampling_boxes"
        }
        ITERATION_LIST = [0, chkpt_iterations-1]
}
*/

REACTION_DATA_OUTPUT {
        STEP = dt
        {COUNT[A,microdomain.sampling_boxes.left_1,FOR_EACH_TIME_STEP]+
                COUNT[A,microdomain.sampling_boxes.right_1,FOR_EACH_TIME_STEP]} => 
                INPUT_FILE & ".A_1"
        {COUNT[A,microdomain.sampling_boxes.left_2,FOR_EACH_TIME_STEP]+
                COUNT[A,microdomain.sampling_boxes.right_2,FOR_EACH_TIME_STEP]} => 
                INPUT_FILE & ".A_2"
        {COUNT[A,microdomain.sampling_boxes.left_3,FOR_EACH_TIME_STEP]+
                COUNT[A,microdomain.sampling_boxes.right_3,FOR_EACH_TIME_STEP]} => 
                INPUT_FILE & ".A_3"
        {COUNT[A,microdomain.sampling_boxes.left_4,FOR_EACH_TIME_STEP]+
                COUNT[A,microdomain.sampling_boxes.right_4,FOR_EACH_TIME_STEP]} => 
                INPUT_FILE & ".A_4"
        {COUNT[A,microdomain.sampling_boxes.left_5,FOR_EACH_TIME_STEP]+
                COUNT[A,microdomain.sampling_boxes.right_5,FOR_EACH_TIME_STEP]} => 
                INPUT_FILE & ".A_5"
        {COUNT[A,microdomain.sampling_boxes.left_6,FOR_EACH_TIME_STEP]+
                COUNT[A,microdomain.sampling_boxes.right_6,FOR_EACH_TIME_STEP]} => 
                INPUT_FILE & ".A_6"
        {COUNT[A,microdomain.sampling_boxes.left_7,FOR_EACH_TIME_STEP]+
                COUNT[A,microdomain.sampling_boxes.right_7,FOR_EACH_TIME_STEP]} => 
                INPUT_FILE & ".A_7"
        {COUNT[A,microdomain.sampling_boxes.left_8,FOR_EACH_TIME_STEP]+
                COUNT[A,microdomain.sampling_boxes.right_8,FOR_EACH_TIME_STEP]} => 
                INPUT_FILE & ".A_8"
}

file input_2
 /* linear_diffusion_2 */

dt = 1.0e-6     iterations = 5000       chkpt_iterations = 20000
D = 6.0e-6      n = 1000

TIME_STEP = dt
ITERATIONS = iterations

PARTITION_X = [-2.55,-2.25,-1.95,-1.65,-1.35,-1.05,-0.75,-0.45,-0.15,
0.15,0.45,0.75,1.05,1.35,1.65,1.95,2.25,2.55]

CHECKPOINT_INFILE = "chkpt"
CHECKPOINT_OUTFILE = "chkpt"
CHECKPOINT_ITERATIONS = chkpt_iterations

DEFINE_LIGAND A {DIFFUSION_CONSTANT = D}

y_value_1 = -1.0                        y_value_2 = 1.0
z_value_1 = -1.0                        z_value_2 = 1.0
ll1 = [-10.0,y_value_1,z_value_1]        ur1 = [10.0,y_value_2,z_value_2]
ll2 = [-0.015,y_value_1,z_value_1]       ur2 = [0.015,y_value_2,z_value_2]
offset = .05
ll3 = [-offset,y_value_1,z_value_1]      ur3 = [offset,y_value_2,z_value_2]

sampling_template BOX {
        CORNERS = ll3,ur3
        FULLY_CLOSED = YES
        TRANSPARENT {LIGAND = A   ELEMENT = ALL_ELEMENTS}
        REMOVE_ELEMENT = TOP
        REMOVE_ELEMENT = BOTTOM
        REMOVE_ELEMENT = FRONT
        REMOVE_ELEMENT = BACK
}

INSTANTIATE microdomain OBJECT {
        release_site SPHERICAL_RELEASE_SITE {
                LOCATION = [0,0,0]
                LIGAND = A
                NUMBER_TO_RELEASE = n
                SITE_DIAMETER = 0.03
        }
        bounding_walls BOX {
                CORNERS = ll1,ur1
                FULLY_CLOSED = YES
                ABSORPTIVE {LIGAND = A   ELEMENT = LEFT}
                ABSORPTIVE {LIGAND = A  ELEMENT = RIGHT}
        }
        center_box BOX {
                CORNERS = ll2,ur2
                FULLY_CLOSED = YES
                TRANSPARENT {LIGAND = A   ELEMENT = ALL_ELEMENTS}
                REMOVE_ELEMENT = TOP
                REMOVE_ELEMENT = BOTTOM
                REMOVE_ELEMENT = FRONT
                REMOVE_ELEMENT = BACK
        }
        sampling_boxes OBJECT {
                left_1 OBJECT sampling_template {TRANSLATE = [-0.3,0,0]}
                left_2 OBJECT sampling_template {TRANSLATE = [-0.6,0,0]}
                left_3 OBJECT sampling_template {TRANSLATE = [-0.9,0,0]}
                left_4 OBJECT sampling_template {TRANSLATE = [-1.2,0,0]}
                left_5 OBJECT sampling_template {TRANSLATE = [-1.5,0,0]}
                left_6 OBJECT sampling_template {TRANSLATE = [-1.8,0,0]}
                left_7 OBJECT sampling_template {TRANSLATE = [-2.1,0,0]}
                left_8 OBJECT sampling_template {TRANSLATE = [-2.4,0,0]}
                right_1 OBJECT sampling_template {TRANSLATE = [0.3,0,0]}
                right_2 OBJECT sampling_template {TRANSLATE = [0.6,0,0]}
                right_3 OBJECT sampling_template {TRANSLATE = [0.9,0,0]}
                right_4 OBJECT sampling_template {TRANSLATE = [1.2,0,0]}
                right_5 OBJECT sampling_template {TRANSLATE = [1.5,0,0]}
                right_6 OBJECT sampling_template {TRANSLATE = [1.8,0,0]}
                right_7 OBJECT sampling_template {TRANSLATE = [2.1,0,0]}
                right_8 OBJECT sampling_template {TRANSLATE = [2.4,0,0]}
        }
}

/*
VIZ_DATA_OUTPUT {
        MODE = DX
        STATE_VALUES {
                A = 1  
                microdomain.bounding_walls = 2
                microdomain.center_box = 3
                microdomain.sampling_boxes = 4
        }
        OBJECT_FILE_DESIGNATORS {
                microdomain.bounding_walls = "bounding_walls"
                microdomain.center_box = "center_box"
                microdomain.sampling_boxes = "sampling_boxes"
        }
        ITERATION_LIST = [[2000 TO 2500 STEP 100], iterations-1]
}
*/

REACTION_DATA_OUTPUT {
        STEP = dt
        {COUNT[A,microdomain.sampling_boxes.left_1,FOR_EACH_TIME_STEP]+
                COUNT[A,microdomain.sampling_boxes.right_1,FOR_EACH_TIME_STEP]}
=>
                INPUT_FILE & ".A_1"
        {COUNT[A,microdomain.sampling_boxes.left_2,FOR_EACH_TIME_STEP]+
                COUNT[A,microdomain.sampling_boxes.right_2,FOR_EACH_TIME_STEP]}
=>
                INPUT_FILE & ".A_2"
        {COUNT[A,microdomain.sampling_boxes.left_3,FOR_EACH_TIME_STEP]+
                COUNT[A,microdomain.sampling_boxes.right_3,FOR_EACH_TIME_STEP]}
=>
                INPUT_FILE & ".A_3"
        {COUNT[A,microdomain.sampling_boxes.left_4,FOR_EACH_TIME_STEP]+
                COUNT[A,microdomain.sampling_boxes.right_4,FOR_EACH_TIME_STEP]}
=>
                INPUT_FILE & ".A_4"
        {COUNT[A,microdomain.sampling_boxes.left_5,FOR_EACH_TIME_STEP]+
                COUNT[A,microdomain.sampling_boxes.right_5,FOR_EACH_TIME_STEP]}
=>
                INPUT_FILE & ".A_5"
        {COUNT[A,microdomain.sampling_boxes.left_6,FOR_EACH_TIME_STEP]+
                COUNT[A,microdomain.sampling_boxes.right_6,FOR_EACH_TIME_STEP]}
=>
                INPUT_FILE & ".A_6"
        {COUNT[A,microdomain.sampling_boxes.left_7,FOR_EACH_TIME_STEP]+
                COUNT[A,microdomain.sampling_boxes.right_7,FOR_EACH_TIME_STEP]}
=>
                INPUT_FILE & ".A_7"
        {COUNT[A,microdomain.sampling_boxes.left_8,FOR_EACH_TIME_STEP]+
                COUNT[A,microdomain.sampling_boxes.right_8,FOR_EACH_TIME_STEP]}
=>
                INPUT_FILE & ".A_8"
}

Return to Tutorials
Return to MCell