44 LOGICAL,
SAVE :: FIRST_PASS = .true.
45 DOUBLE PRECISION :: OMEGA_MAG,OMEGA_UNIT(3),ROT_ANGLE
52 IF(first_pass .AND. intg_adams_bashforth)
THEN 54 IF(is_nonexistent(l)) cycle
55 IF(is_entering(l).or.is_entering_ghost(l)) cycle
57 des_acc_old(l,:) = fc(l,:)/pmass(l) + grav(:)
58 rot_acc_old(l,:) = tow(l,:)
80 WHERE(particle_state == normal_particle) des_vel_new(:,1) = &
81 des_vel_new(:,1) + dtsolid*(fc(:,1)/pmass(:) + grav(1))
82 WHERE(particle_state < normal_ghost) des_pos_new(:,1) = &
83 des_pos_new(:,1) + des_vel_new(:,1)*dtsolid
87 WHERE(particle_state == normal_particle) des_vel_new(:,2) = &
88 des_vel_new(:,2) + dtsolid*(fc(:,2)/pmass(:) + grav(2))
89 WHERE(particle_state < normal_ghost) des_pos_new(:,2) = &
90 des_pos_new(:,2) + des_vel_new(:,2)*dtsolid
94 WHERE(particle_state == normal_particle) des_vel_new(:,3) = &
95 des_vel_new(:,3) + dtsolid*(fc(:,3)/pmass(:) + grav(3))
96 WHERE(particle_state < normal_ghost) des_pos_new(:,3) = &
97 des_pos_new(:,3) + des_vel_new(:,3)*dtsolid
101 WHERE(particle_state == normal_particle) omega_new(:,1) = &
102 omega_new(:,1) + tow(:,1)*omoi(:)*dtsolid
106 WHERE(particle_state == normal_particle)omega_new(:,2) = &
107 omega_new(:,2) + tow(:,2)*omoi(:)*dtsolid
111 WHERE(particle_state == normal_particle)omega_new(:,3) = &
112 omega_new(:,3) + tow(:,3)*omoi(:)*dtsolid
117 ELSEIF (intg_adams_bashforth)
THEN 121 WHERE(particle_state == normal_particle) &
122 fc(:max_pip,1) = fc(:max_pip,1)/pmass(:max_pip) + grav(1)
123 WHERE(particle_state == normal_particle) &
124 des_vel_new(:max_pip,1) = des_vel_old(:max_pip,1) + 0.5d0* &
125 (3.d0*fc(:max_pip,1)-des_acc_old(:max_pip,1) )*dtsolid
126 des_acc_old(:max_pip,1) = fc(:max_pip,1)
128 WHERE(particle_state < normal_ghost) &
129 des_pos_new(:max_pip,1) = des_pos_old(:max_pip,1) + 0.5d0* &
130 (des_vel_old(:max_pip,1)+des_vel_new(:max_pip,1))*dtsolid
131 fc(:max_pip,1) =
zero 134 WHERE(particle_state == normal_particle) &
135 fc(:max_pip,2) = fc(:max_pip,2)/pmass(:max_pip) + grav(2)
136 WHERE(particle_state == normal_particle) &
137 des_vel_new(:max_pip,2) = des_vel_old(:max_pip,2) + 0.5d0* &
138 (3.d0*fc(:max_pip,2)-des_acc_old(:max_pip,2) )*dtsolid
139 des_acc_old(:max_pip,2) = fc(:max_pip,2)
141 WHERE(particle_state < normal_ghost) &
142 des_pos_new(:max_pip,2) = des_pos_old(:max_pip,2) + 0.5d0* &
143 (des_vel_old(:max_pip,2)+des_vel_new(:max_pip,2))*dtsolid
144 fc(:max_pip,2) =
zero 147 WHERE(particle_state == normal_particle) &
148 fc(:max_pip,3) = fc(:max_pip,3)/pmass(:max_pip) + grav(3)
149 WHERE(particle_state == normal_particle) &
150 des_vel_new(:max_pip,3) = des_vel_old(:max_pip,3) + 0.5d0* &
151 (3.d0*fc(:max_pip,3)-des_acc_old(:max_pip,3) )*dtsolid
152 des_acc_old(:max_pip,3) = fc(:max_pip,3)
154 WHERE(particle_state < normal_ghost) &
155 des_pos_new(:max_pip,3) = des_pos_old(:max_pip,3) + 0.5d0* &
156 (des_vel_old(:max_pip,3)+des_vel_new(:max_pip,3))*dtsolid
157 fc(:max_pip,3) =
zero 160 WHERE(particle_state(:max_pip) == normal_particle) &
161 omega_new(:max_pip,1) = omega_old(:max_pip,1) + 0.5d0* &
162 (3.d0*tow(:max_pip,1)*omoi(:max_pip) - &
163 rot_acc_old(:max_pip,1))*dtsolid
164 WHERE(particle_state(:max_pip) == normal_particle) &
165 rot_acc_old(:max_pip,1) = tow(:max_pip,1)*omoi(:max_pip)
166 tow(:max_pip,1) =
zero 169 WHERE(particle_state == normal_particle) &
170 omega_new(:max_pip,2) = omega_old(:max_pip,2) + 0.5d0* &
171 (3.d0*tow(:max_pip,2)*omoi(:max_pip)- &
172 rot_acc_old(:max_pip,2) )*dtsolid
173 WHERE(particle_state == normal_particle) &
174 rot_acc_old(:max_pip,2) = tow(:max_pip,2)*omoi(:max_pip)
175 tow(:max_pip,2) =
zero 178 WHERE(particle_state == normal_particle) &
179 omega_new(:max_pip,3) = omega_old(:max_pip,3) + 0.5d0* &
180 (3.d0*tow(:max_pip,3)*omoi(:max_pip)- &
181 rot_acc_old(:max_pip,3) )*dtsolid
182 WHERE(particle_state == normal_particle) &
183 rot_acc_old(:max_pip,3) = tow(:max_pip,3)*omoi(:max_pip)
184 tow(:max_pip,3) =
zero 192 aabb%minendpoint(:) = des_pos_new(l,:)-des_radius(l)
193 aabb%maxendpoint(:) = des_pos_new(l,:)+des_radius(l)
203 IF(particle_orientation)
THEN 205 omega_mag = omega_new(l,1)**2 +omega_new(l,2)**2 + omega_new
207 IF(omega_mag>
zero)
THEN 208 omega_mag=dsqrt(omega_mag)
209 omega_unit(:) = omega_new(l,:)/omega_mag
210 rot_angle = omega_mag * dtsolid
212 orientation(:,l) = orientation(:,l)*dcos(rot_angle) + &
213 des_crossprdct(omega_unit,orientation(:,l))*dsin(rot_angle
223 IF(.NOT.do_nsearch)
THEN 226 do_nsearch = do_nsearch .or. &
227 (des_pos_new(l,1) - ppos(l,1))**2+ &
228 (des_pos_new(l,2) - ppos(l,2))**2+ &
229 (des_pos_new(l,3) - ppos(l,3))**2 >= &
230 (neighbor_search_rad_ratio*des_radius(l))**2
242 1002
FORMAT(/1x,70(
'*')//&
243 ' From: CFNEWVALUES -',/&
244 ' Message: Particle ',i10,
' moved a distance ', es17.9, &
245 ' during a',/10x,
'single solids time step, which is ',&
246 ' greater than',/10x,
'its radius: ', es17.9)
247 1003
FORMAT(1x,70(
'*')/)
253 include
'functions.inc'
double precision, parameter one
subroutine, public multisap_update(this, aabb, handlelist)
subroutine, public multisap_sort(this)
type(multisap_t) multisap
type(boxhandlelist_t), dimension(:), allocatable boxhandle
double precision, parameter zero