34 integer(I4B) :: nmesh_node
35 integer(I4B) :: nmesh_face
36 integer(I4B) :: max_nmesh_face_nodes
46 integer(I4B) :: mesh_node_x
47 integer(I4B) :: mesh_node_y
48 integer(I4B) :: mesh_face_x
49 integer(I4B) :: mesh_face_y
50 integer(I4B) :: mesh_face_xbnds
51 integer(I4B) :: mesh_face_ybnds
52 integer(I4B) :: mesh_face_nodes
55 integer(I4B),
dimension(:),
allocatable :: export
56 integer(I4B),
dimension(:),
allocatable :: dependent
66 integer(I4B),
pointer :: chunk_face
87 character(len=*),
intent(in) :: pkgtype
88 character(len=*),
intent(in) :: pkgname
89 character(len=*),
intent(in) :: mempath
103 subroutine mesh_init(this, modelname, modeltype, modelfname, nc_fname, &
104 disenum, nctype, lenuni, iout)
107 character(len=*),
intent(in) :: modelname
108 character(len=*),
intent(in) :: modeltype
109 character(len=*),
intent(in) :: modelfname
110 character(len=*),
intent(in) :: nc_fname
111 integer(I4B),
intent(in) :: disenum
112 integer(I4B),
intent(in) :: nctype
113 integer(I4B),
intent(in) :: lenuni
114 integer(I4B),
intent(in) :: iout
115 logical(LGP) :: found
118 call this%NCModelExportType%init(modelname, modeltype, modelfname, nc_fname, &
119 disenum, nctype, iout)
122 allocate (this%chunk_face)
126 if (this%ncf_mempath /=
'')
then
127 call mem_set_value(this%chunk_face,
'CHUNK_FACE', this%ncf_mempath, found)
130 if (this%chunk_time > 0 .and. this%chunk_face > 0)
then
131 this%chunking_active = .true.
132 else if (this%chunk_time > 0 .or. this%chunk_face > 0)
then
135 write (
warnmsg,
'(a)')
'Ignoring user provided NetCDF chunking parameter. &
136 &Define chunk_time and chunk_face input parameters to see an effect in &
137 &file "'//trim(nc_fname)//
'".'
141 if (lenuni == 1)
then
148 call nf_verify(nf90_create(this%nc_fname, &
149 ior(nf90_clobber, nf90_netcdf4), this%ncid), &
158 call nf_verify(nf90_close(this%ncid), this%nc_fname)
159 deallocate (this%chunk_face)
160 nullify (this%chunk_face)
170 do idx = 1, this%pkglist%Count()
171 export_pkg => this%get(idx)
172 call this%export_df(export_pkg)
184 integer(I4B) :: iparam, iaux, layer
187 do iparam = 1, export_pkg%nparam
194 export_pkg%mf6_input%component_type, &
195 export_pkg%mf6_input%subcomponent_type, &
196 'PERIOD', export_pkg%param_names(iparam),
'')
198 select case (idt%shape)
200 call this%create_timeseries(idt, iparam, iaux, layer, export_pkg)
202 do layer = 1, this%nlay
203 call this%create_timeseries(idt, iparam, iaux, layer, export_pkg)
206 do iaux = 1, export_pkg%naux
207 call this%create_timeseries(idt, iparam, iaux, layer, export_pkg)
210 do iaux = 1, export_pkg%naux
211 do layer = 1, this%nlay
212 call this%create_timeseries(idt, iparam, iaux, layer, export_pkg)
227 integer(I4B),
intent(in) :: iparam
228 integer(I4B),
intent(in) :: iaux
229 integer(I4B),
intent(in) :: layer
231 character(len=LINELENGTH) :: varname, longname, nc_tag
232 integer(I4B) :: varid
235 nc_tag = this%input_attribute(export_pkg%mf6_input%subcomponent_name, &
239 varname = export_varname(export_pkg%mf6_input%subcomponent_name, &
240 idt%tagname, export_pkg%mf6_input%mempath, &
241 layer=layer, iaux=iaux)
242 longname = export_longname(idt%longname, &
243 export_pkg%mf6_input%subcomponent_name, &
244 idt%tagname, export_pkg%mf6_input%mempath, &
245 layer=layer, iaux=iaux, &
246 component_type=idt%component_type, &
247 subcomponent_type=idt%subcomponent_type)
250 select case (idt%datatype)
251 case (
'DOUBLE1D',
'DOUBLE2D')
252 call nf_verify(nf90_def_var(this%ncid, varname, nf90_double, &
253 (/this%dim_ids%nmesh_face, &
254 this%dim_ids%time/), &
257 call nf_verify(nf90_put_att(this%ncid, varid, &
261 call nf_verify(nf90_def_var(this%ncid, varname, nf90_int, &
262 (/this%dim_ids%nmesh_face, &
263 this%dim_ids%time/), &
266 call nf_verify(nf90_put_att(this%ncid, varid, &
267 '_FillValue', (/nf90_fill_int/)), &
272 if (this%chunking_active)
then
273 call nf_verify(nf90_def_var_chunking(this%ncid, &
277 this%chunk_time/)), &
283 this%shuffle, this%nc_fname)
286 call nf_verify(nf90_put_att(this%ncid, varid, &
287 'units', this%lenunits), this%nc_fname)
288 call nf_verify(nf90_put_att(this%ncid, varid, &
289 'long_name', longname), this%nc_fname)
293 this%gridmap_name, this%nc_fname)
294 call ncvar_mf6attr(this%ncid, varid, layer, iaux, nc_tag, this%nc_fname)
297 if (idt%tagname ==
'AUX')
then
299 export_pkg%varids_aux(iaux, layer) = varid
301 export_pkg%varids_aux(iaux, 1) = varid
305 export_pkg%varids_param(iparam, layer) = varid
307 export_pkg%varids_param(iparam, 1) = varid
317 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'title', &
318 this%annotation%title), this%nc_fname)
320 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'source', &
321 this%annotation%source), this%nc_fname)
323 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'modflow_grid', &
324 this%annotation%grid), this%nc_fname)
326 if (this%annotation%mesh /=
'')
then
327 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'mesh', &
328 this%annotation%mesh), this%nc_fname)
332 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'modflow_model', &
333 this%annotation%model), this%nc_fname)
335 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'history', &
336 this%annotation%history), this%nc_fname)
338 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'Conventions', &
339 this%annotation%conventions), &
348 character(len=*),
intent(in) :: pkgtype
349 character(len=*),
intent(in) :: pkgname
350 character(len=*),
intent(in) :: mempath
352 intent(in) :: param_dfns
354 integer(I4B) :: iparam, isize
356 do iparam = 1,
size(param_dfns)
358 idt => param_dfns(iparam)
360 if (idt%blockname ==
'GRIDDATA')
then
362 call get_isize(idt%mf6varname, mempath, isize)
364 call this%export_input_array(pkgtype, pkgname, mempath, idt)
380 character(LENCOMPONENTNAME) :: ptype, pname, pkgtype
381 character(len=LENMEMPATH) :: input_mempath
383 pointer :: pkgtypes => null()
385 pointer :: pkgnames => null()
387 pointer :: mempaths => null()
389 character(len=LENMEMPATH) :: mempath
391 integer(I4B),
pointer :: export_arrays
392 logical(LGP) :: found
397 call mem_setptr(pkgtypes,
'PKGTYPES', input_mempath)
398 call mem_setptr(pkgnames,
'PKGNAMES', input_mempath)
399 call mem_setptr(mempaths,
'MEMPATHS', input_mempath)
401 allocate (export_arrays)
403 do n = 1,
size(mempaths)
408 mempath = mempaths(n)
413 if (mempath /=
'')
then
415 call mem_set_value(export_arrays,
'EXPORT_NC', mempath, found, &
417 if (export_arrays > 0)
then
419 param_dfns => param_definitions(this%modeltype, pkgtype)
420 call this%export_input_arrays(ptype, pname, mempath, param_dfns)
426 deallocate (export_arrays)
433 character(len=LINELENGTH) :: varname, longname
443 write (varname,
'(a,i0)') trim(this%xname)//
'_l', k
444 write (longname,
'(a,i0,a)') trim(this%annotation%longname)// &
448 call nf_verify(nf90_def_var(this%ncid, varname, nf90_double, &
449 (/this%dim_ids%nmesh_face, &
450 this%dim_ids%time/), &
451 this%var_ids%dependent(k)), &
455 if (this%chunking_active)
then
456 call nf_verify(nf90_def_var_chunking(this%ncid, &
457 this%var_ids%dependent(k), &
460 this%chunk_time/)), &
465 call ncvar_deflate(this%ncid, this%var_ids%dependent(k), this%deflate, &
466 this%shuffle, this%nc_fname)
469 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
470 'units', this%lenunits), this%nc_fname)
471 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
472 'long_name', longname), this%nc_fname)
473 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
479 this%gridmap_name, this%nc_fname)
487 integer(I4B) :: var_id
488 character(len=LINELENGTH) :: gmname
489 character(len=LENBIGLINE) :: effective_crs_wkt
492 if (this%wkt /=
'' .or. this%crs_wkt /=
'')
then
494 call nf_verify(nf90_redef(this%ncid), this%nc_fname)
495 call nf_verify(nf90_def_var(this%ncid, this%gridmap_name, nf90_int, &
496 var_id), this%nc_fname)
498 if (this%wkt /=
'')
then
499 call nf_verify(nf90_put_att(this%ncid, var_id,
'wkt', this%wkt), &
503 if (this%crs_wkt /=
'')
then
504 effective_crs_wkt = this%crs_wkt
506 effective_crs_wkt = this%wkt
508 call nf_verify(nf90_put_att(this%ncid, var_id,
'crs_wkt', &
509 trim(effective_crs_wkt)), this%nc_fname)
512 if (gmname /=
'')
then
513 call nf_verify(nf90_put_att(this%ncid, var_id,
'grid_mapping_name', &
514 trim(gmname)), this%nc_fname)
516 call nf_verify(nf90_enddef(this%ncid), this%nc_fname)
517 call nf_verify(nf90_put_var(this%ncid, var_id, 1), &
528 call nf_verify(nf90_def_var(this%ncid, this%mesh_name, nf90_int, &
529 this%var_ids%mesh), this%nc_fname)
532 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh,
'cf_role', &
533 'mesh_topology'), this%nc_fname)
534 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh,
'long_name', &
535 '2D mesh topology'), this%nc_fname)
536 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh, &
537 'topology_dimension', 2), this%nc_fname)
538 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh,
'face_dimension', &
539 'nmesh_face'), this%nc_fname)
540 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh, &
541 'node_coordinates',
'mesh_node_x mesh_node_y'), &
543 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh, &
544 'face_coordinates',
'mesh_face_x mesh_face_y'), &
546 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh, &
547 'face_node_connectivity',
'mesh_face_nodes'), &
551 call nf_verify(nf90_def_var(this%ncid,
'mesh_node_x', nf90_double, &
552 (/this%dim_ids%nmesh_node/), &
553 this%var_ids%mesh_node_x), this%nc_fname)
556 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_x, &
557 'units', this%lenunits), this%nc_fname)
558 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_x, &
559 'standard_name',
'projection_x_coordinate'), &
561 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_x, &
562 'long_name',
'Easting'), this%nc_fname)
564 if (this%gridmap_name /=
'')
then
566 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_x, &
567 'grid_mapping', this%gridmap_name), &
572 call nf_verify(nf90_def_var(this%ncid,
'mesh_node_y', nf90_double, &
573 (/this%dim_ids%nmesh_node/), &
574 this%var_ids%mesh_node_y), this%nc_fname)
577 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_y, &
578 'units', this%lenunits), this%nc_fname)
579 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_y, &
580 'standard_name',
'projection_y_coordinate'), &
582 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_y, &
583 'long_name',
'Northing'), this%nc_fname)
585 if (this%gridmap_name /=
'')
then
587 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_y, &
588 'grid_mapping', this%gridmap_name), &
593 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_x', nf90_double, &
594 (/this%dim_ids%nmesh_face/), &
595 this%var_ids%mesh_face_x), this%nc_fname)
598 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x, &
599 'units', this%lenunits), this%nc_fname)
600 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x, &
601 'standard_name',
'projection_x_coordinate'), &
603 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x, &
604 'long_name',
'Easting'), this%nc_fname)
605 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x,
'bounds', &
606 'mesh_face_xbnds'), this%nc_fname)
607 if (this%gridmap_name /=
'')
then
609 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x, &
610 'grid_mapping', this%gridmap_name), &
615 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_xbnds', nf90_double, &
616 (/this%dim_ids%max_nmesh_face_nodes, &
617 this%dim_ids%nmesh_face/), &
618 this%var_ids%mesh_face_xbnds), &
622 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_y', nf90_double, &
623 (/this%dim_ids%nmesh_face/), &
624 this%var_ids%mesh_face_y), this%nc_fname)
627 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y, &
628 'units', this%lenunits), this%nc_fname)
629 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y, &
630 'standard_name',
'projection_y_coordinate'), &
632 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y, &
633 'long_name',
'Northing'), this%nc_fname)
634 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y,
'bounds', &
635 'mesh_face_ybnds'), this%nc_fname)
637 if (this%gridmap_name /=
'')
then
639 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y, &
640 'grid_mapping', this%gridmap_name), &
645 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_ybnds', nf90_double, &
646 (/this%dim_ids%max_nmesh_face_nodes, &
647 this%dim_ids%nmesh_face/), &
648 this%var_ids%mesh_face_ybnds), &
652 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_nodes', nf90_int, &
653 (/this%dim_ids%max_nmesh_face_nodes, &
654 this%dim_ids%nmesh_face/), &
655 this%var_ids%mesh_face_nodes), &
659 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_nodes, &
660 'cf_role',
'face_node_connectivity'), &
662 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_nodes, &
664 'Vertices bounding cell (counterclockwise)'), &
666 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_nodes, &
667 '_FillValue', (/nf90_fill_int/)), &
669 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_nodes, &
670 'start_index', 1), this%nc_fname)
676 integer(I4B),
intent(in) :: ncid
677 integer(I4B),
intent(in) :: varid
678 integer(I4B),
intent(in) :: chunk_face
679 character(len=*),
intent(in) :: nc_fname
680 if (chunk_face > 0)
then
681 call nf_verify(nf90_def_var_chunking(ncid, varid, nf90_chunked, &
682 (/chunk_face/)), nc_fname)
689 integer(I4B),
intent(in) :: ncid
690 integer(I4B),
intent(in) :: varid
691 integer(I4B),
intent(in) :: deflate
692 integer(I4B),
intent(in) :: shuffle
693 character(len=*),
intent(in) :: nc_fname
694 if (deflate >= 0)
then
695 call nf_verify(nf90_def_var_deflate(ncid, varid, shuffle=shuffle, &
696 deflate=1, deflate_level=deflate), &
704 integer(I4B),
intent(in) :: ncid
705 integer(I4B),
intent(in) :: varid
706 character(len=*),
intent(in) :: gridmap_name
707 character(len=*),
intent(in) :: nc_fname
709 call nf_verify(nf90_put_att(ncid, varid,
'mesh',
'mesh'), nc_fname)
710 call nf_verify(nf90_put_att(ncid, varid,
'location',
'face'), nc_fname)
711 call nf_verify(nf90_put_att(ncid, varid,
'coordinates', &
712 'mesh_face_x mesh_face_y'), nc_fname)
714 if (gridmap_name /=
'')
then
715 call nf_verify(nf90_put_att(ncid, varid,
'grid_mapping', &
716 gridmap_name), nc_fname)
723 integer(I4B),
intent(in) :: ncid
724 integer(I4B),
intent(in) :: varid
725 integer(I4B),
intent(in) :: layer
726 integer(I4B),
intent(in) :: iaux
727 character(len=*),
intent(in) :: nc_tag
728 character(len=*),
intent(in) :: nc_fname
729 if (nc_tag /=
'')
then
730 call nf_verify(nf90_put_att(ncid, varid,
'modflow_input', &
733 call nf_verify(nf90_put_att(ncid, varid,
'layer', &
737 call nf_verify(nf90_put_att(ncid, varid,
'modflow_iaux', &
abstract interfaces for derived ugrid netcd export types
This module contains simulation constants.
integer(i4b), parameter linelength
maximum length of a standard line
integer(i4b), parameter lencomponentname
maximum length of a component name
real(dp), parameter dnodata
real no data constant
integer(i4b), parameter lenbigline
maximum length of a big line
real(dp), parameter dhnoflo
real no flow constant
integer(i4b), parameter lenmempath
maximum length of the memory path
This module contains the DefinitionSelectModule.
type(inputparamdefinitiontype) function, pointer, public get_param_definition_type(input_definition_types, component_type, subcomponent_type, blockname, tagname, filename, found)
Return parameter definition.
type(inputparamdefinitiontype) function, dimension(:), pointer, public param_definitions(component, subcomponent)
logical function, public idm_multi_package(component, subcomponent)
This module defines variable data types.
character(len=lenmempath) function create_mem_path(component, subcomponent, context)
returns the path to the memory object
subroutine, public get_isize(name, mem_path, isize)
@ brief Get the number of elements for this variable
This module contains the MeshModelModule.
subroutine, public ncvar_mf6attr(ncid, varid, layer, iaux, nc_tag, nc_fname)
put variable internal attributes
subroutine define_gridmap(this)
create the file grid mapping container variable
subroutine create_timeseries(this, idt, iparam, iaux, layer, export_pkg)
create timeseries export variable
subroutine, public ncvar_gridmap(ncid, varid, gridmap_name, nc_fname)
put variable gridmap attributes
subroutine, public ncvar_chunk(ncid, varid, chunk_face, nc_fname)
define variable chunking
subroutine mesh_init(this, modelname, modeltype, modelfname, nc_fname, disenum, nctype, lenuni, iout)
initialize
subroutine mesh_destroy(this)
initialize
subroutine add_global_att(this)
create file (group) attributes
subroutine add_pkg_data(this)
determine packages to write gridded input
subroutine df_export(this)
define timeseries input variables
subroutine export_df(this, export_pkg)
define export package
subroutine export_input_arrays(this, pkgtype, pkgname, mempath, param_dfns)
write package gridded input data
subroutine define_dependent(this)
create the model layer dependent variables
subroutine, public ncvar_deflate(ncid, varid, deflate, shuffle, nc_fname)
define variable compression
subroutine create_mesh(this)
create the file mesh container variable
This module contains the NCModelExportModule.
character(len=linelength) function, public wkt_to_cf_gridmapping(wkt)
map a WKT string to a CF-1.11 grid_mapping_name
character(len=linelength) function, public export_varname(pkgname, tagname, mempath, layer, iaux)
build netcdf variable name
character(len=linelength) function, public export_longname(longname, pkgname, tagname, mempath, layer, iaux, component_type, subcomponent_type)
build netcdf variable longname
This module contains the NetCDFCommonModule.
subroutine, public nf_verify(res, nc_fname)
error check a netcdf-fortran interface call
This module contains simulation methods.
subroutine, public store_warning(msg, substring)
Store warning message.
subroutine, public store_error(msg, terminate)
Store an error message.
subroutine, public store_error_filename(filename, terminate)
Store the erroring file name.
This module contains simulation variables.
character(len=maxcharlen) errmsg
error message string
character(len=linelength) idm_context
character(len=maxcharlen) warnmsg
warning message string
This module contains the SourceCommonModule.
character(len=lencomponentname) function, public idm_subcomponent_type(component, subcomponent)
component from package or model type
This class is used to store a single deferred-length character string. It was designed to work in an ...
base ugrid netcdf export type
type for storing model export dimension ids
type for storing model export variable ids
abstract type for model netcdf export type