allocate memory to physical state of igrid node
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | igrid | |||
| type(state) | :: | s | ||||
| integer, | intent(in) | :: | ixGmin1 | |||
| integer, | intent(in) | :: | ixGmin2 | |||
| integer, | intent(in) | :: | ixGmin3 | |||
| integer, | intent(in) | :: | ixGmax1 | |||
| integer, | intent(in) | :: | ixGmax2 | |||
| integer, | intent(in) | :: | ixGmax3 | |||
| logical, | intent(in) | :: | alloc_once_for_ps |
subroutine alloc_state(igrid, s, ixGmin1,ixGmin2,ixGmin3,ixGmax1,ixGmax2,& ixGmax3, alloc_once_for_ps) use mod_global_parameters type(state) :: s integer, intent(in) :: igrid, ixGmin1,ixGmin2,ixGmin3,ixGmax1,ixGmax2,& ixGmax3 logical, intent(in) :: alloc_once_for_ps integer :: ixGsmin1,ixGsmin2,ixGsmin3,ixGsmax1,ixGsmax2,& ixGsmax3 !allocate(s%w(ixG^S,1:nw)) s%w => bg(s%istep)%w(:,:,:,:,igrid) s%igrid=igrid s%w=0.d0 s%ixGmin1=ixGmin1;s%ixGmin2=ixGmin2;s%ixGmin3=ixGmin3;s%ixGmax1=ixGmax1 s%ixGmax2=ixGmax2;s%ixGmax3=ixGmax3; ixGsmin1 = ixGmin1-1; ixGsmax1 = ixGmax1; ixGsmin2 = ixGmin2-1 ixGsmax2 = ixGmax2; ixGsmin3 = ixGmin3-1; ixGsmax3 = ixGmax3 if(stagger_grid) then allocate(s%ws(ixGsmin1:ixGsmax1,ixGsmin2:ixGsmax2,ixGsmin3:ixGsmax3,& 1:nws)) s%ws=0.d0 if(record_electric_field) then allocate(s%we(ixGsmin1:ixGsmax1,ixGsmin2:ixGsmax2,ixGsmin3:ixGsmax3,& 1:nws)) s%we=0.d0 end if s%ixGsmin1=ixGsmin1;s%ixGsmin2=ixGsmin2;s%ixGsmin3=ixGsmin3 s%ixGsmax1=ixGsmax1;s%ixGsmax2=ixGsmax2;s%ixGsmax3=ixGsmax3; end if if(alloc_once_for_ps) then ! allocate extra variables for ps state if(nw_extra>0) allocate(s%wextra(ixGmin1:ixGmax1,ixGmin2:ixGmax2,& ixGmin3:ixGmax3,1:nw_extra)) ! All of this block's geometry lives in bgeo, one array per quantity for ! all blocks; point this block's views at its slice of them. call point_at_geometry(s, bgeo, igrid, ixGmin1,ixGmin2,ixGmin3,ixGmax1,& ixGmax2,ixGmax3, ixGextmin1,ixGextmin2,ixGextmin3,ixGextmax1,& ixGextmax2,ixGextmax3) ! allocate physical boundary flag allocate(s%is_physical_boundary(2*ndim)) if(local_timestep) then allocate(s%dt(ixGmin1:ixGmax1,ixGmin2:ixGmax2,ixGmin3:ixGmax3)) endif if(B0field) then allocate(s%B0(ixGmin1:ixGmax1,ixGmin2:ixGmax2,ixGmin3:ixGmax3,1:ndir,& 0:ndim)) allocate(s%J0(ixGmin1:ixGmax1,ixGmin2:ixGmax2,ixGmin3:ixGmax3,& 7-2*ndir:3)) end if if(number_equi_vars > 0) then allocate(s%equi_vars(ixGmin1:ixGmax1,ixGmin2:ixGmax2,ixGmin3:ixGmax3,& 1:number_equi_vars,0:ndim)) endif ! allocate space for special values for each block state if(phys_trac) then ! special_values(1) Tcoff local ! special_values(2) Tmax local ! special_values(3:2+ndim) Bdir local allocate(s%special_values(ndim+2)) end if else ! share common info from ps states to save memory if(nw_extra>0) s%wextra=>ps(igrid)%wextra s%x=>ps(igrid)%x s%dx=>ps(igrid)%dx s%ds=>ps(igrid)%ds s%dvolume=>ps(igrid)%dvolume s%surfaceC=>ps(igrid)%surfaceC s%is_physical_boundary=>ps(igrid)%is_physical_boundary if(B0field) then s%B0=>ps(igrid)%B0 s%J0=>ps(igrid)%J0 end if if(number_equi_vars > 0) then s%equi_vars=>ps(igrid)%equi_vars endif if(phys_trac) s%special_values=>ps(igrid)%special_values end if end subroutine alloc_state