submodule (static_data_m) static_data_equi_on_mesh_s !! Handles static data related with equi_on_mesh implicit none contains module subroutine static_equi_on_mesh_init(comm_handler, nf90_filepath) type(comm_handler_t), intent(in) :: comm_handler character(len=*), intent(in), optional :: nf90_filepath logical :: write_to_netcdf = .false. character(len=3) :: plane_c integer :: nf90_id, nf90_stat, nf90_grpid character(len=:), allocatable :: nf90_fpath if (is_rank_info_writer) then write(get_stdout(),*)'' write(get_stdout(),*)repeat('-',80) write(get_stdout(),*)'Initializing static data: equi_on_mesh' endif if (.not.equi_is_initialized) then call handle_error('equi must be initialized at equi_on_mesh initialization', & GRILLIX_ERR_STATIC_DATA, __LINE__, __FILE__) endif if (.not.multigrid_is_initialized) then call handle_error('multigrid must be initialized at equi_on_mesh initialization', & GRILLIX_ERR_STATIC_DATA, __LINE__, __FILE__) endif ! Select NetCDF file path and enable writing when required write(plane_c,'(I3.3)')comm_handler%get_plane() if (present(nf90_filepath)) then nf90_fpath = nf90_filepath else if (equi%is_axisymmetric()) then nf90_fpath = trim(static_data_dirpath)//'/equi_on_mesh.nc' if ((cntrl_build_equi_on_mesh == BUILD_AND_WRITE) .and. (is_rank_info_writer)) then write_to_netcdf = .true. endif else nf90_fpath = trim(static_data_dirpath)//'/equi_plane'//plane_c//'.nc' if (cntrl_build_equi_on_mesh == BUILD_AND_WRITE) then write_to_netcdf = .true. endif endif endif ! Associate staggered type if (equi%is_axisymmetric()) then equi_on_stag => equi_on_cano else allocate(equi_on_stag_mem) equi_on_stag => equi_on_stag_mem endif select case(cntrl_build_equi_on_mesh) case(BUILD_NOWRITE, BUILD_AND_WRITE) call equi_on_cano%fill_storage(equi, mesh_cano) if (.not.equi%is_axisymmetric()) then call equi_on_stag_mem%fill_storage(equi, mesh_stag) endif equi_on_mesh_is_initialized = .true. case(READ) nf90_stat = nf90_open(nf90_fpath, NF90_NETCDF4, nf90_id) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) if (equi%is_axisymmetric()) then call equi_on_cano%read_netcdf(nf90_id) else nf90_stat = nf90_inq_grp_ncid(nf90_id, 'canonical', nf90_grpid) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) call equi_on_cano%read_netcdf(nf90_grpid) nf90_stat = nf90_inq_grp_ncid(nf90_id, 'staggered', nf90_grpid) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) call equi_on_stag%read_netcdf(nf90_grpid) endif nf90_stat = nf90_close(nf90_id) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) equi_on_mesh_is_initialized = .true. case(NONE) if (is_rank_info_writer) then write(get_stdout(),*) 'equi_on_mesh not built because it was not requested by the user.' endif case default call handle_error('cntrl_build_equi_on_mesh not valid', & GRILLIX_ERR_STATIC_DATA, __LINE__, __FILE__) end select if (write_to_netcdf) then if (is_rank_info_writer) then write(get_stdout(),*)'Writing equi_on_mesh data to file (series): ' // nf90_fpath endif nf90_stat = nf90_create(nf90_fpath, NF90_NETCDF4, nf90_id) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) if (equi%is_axisymmetric()) then call equi_on_cano%write_netcdf(nf90_id) else nf90_stat = nf90_def_grp(nf90_id, 'canonical', nf90_grpid) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) call equi_on_cano%write_netcdf(nf90_grpid) nf90_stat = nf90_def_grp(nf90_id, 'staggered', nf90_grpid) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) call equi_on_stag%write_netcdf(nf90_grpid) endif nf90_stat = nf90_close(nf90_id) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) endif if (is_rank_info_writer) then write(get_stdout(),*)repeat('-',80) write(get_stdout(),*)'' endif end subroutine end submodule