diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 8fbcb1c91..42bbbe7f7 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -22,4 +22,5 @@ | MetBenjaminWent | Benjamin Went | Met Office | 2026-01-30 | | jcsmeto | James Cunningham-Smith | Met Office | 2026-02-06 | | thomasmelvin | Thomas Melvin | Met Office | 2026-01-15 | -| ericaneininger | Erica Neininger | Met Office | 2026-03-02 | \ No newline at end of file +| ericaneininger | Erica Neininger | Met Office | 2026-03-02 | +| cjohnson-pi | Christine Johnson | Met Office | 2026-03-05 | \ No newline at end of file diff --git a/applications/lbc_demo/example/mesh_config.nml b/applications/lbc_demo/example/mesh_config.nml index c12af0798..c42b234d9 100644 --- a/applications/lbc_demo/example/mesh_config.nml +++ b/applications/lbc_demo/example/mesh_config.nml @@ -16,15 +16,16 @@ / &planar_mesh - edge_cells_x = 30 - edge_cells_y = 30 - domain_size = 24.0, 22.0 - domain_centre = 0.0, 0.0 - periodic_x = .false. - periodic_y = .false. - create_lbc_mesh = .true. - lbc_rim_depth = 6 - lbc_parent_mesh = 'primary' + edge_cells_x = 30 + edge_cells_y = 30 + domain_size = 24.0, 22.0 + domain_centre = 0.0, 0.0 + periodic_x = .false. + periodic_y = .false. + create_lbc_mesh = .true. + lbc_rim_depth = 6 + lbc_parent_mesh = 'primary' + stretch_function = 'uniform' / &partitions diff --git a/mesh_tools/example/planar_mesh_gen.nml b/mesh_tools/example/planar_mesh_gen.nml index d38ad7eb9..fa45be957 100644 --- a/mesh_tools/example/planar_mesh_gen.nml +++ b/mesh_tools/example/planar_mesh_gen.nml @@ -28,12 +28,11 @@ mesh_file_prefix = 'planar_mesh' geometry = 'spherical' topology = 'non_periodic' - n_meshes = 2 - mesh_names = 'mesh_A','mesh_B' - mesh_maps = 'mesh_A:mesh_B' + n_meshes = 1 + mesh_names = 'mesh_A' partition_mesh = .false. coord_sys = 'll' - rotate_mesh = .true. + rotate_mesh = .false. / !================================================================== @@ -51,16 +50,16 @@ ! be a factor of the other. &planar_mesh - edge_cells_x = 48, 24 - edge_cells_y = 24, 12 + edge_cells_x = 48,24 + edge_cells_y = 24,12 domain_size = 48.0, 24.0 - domain_centre = 0.0, 0.0 + domain_centre = 5.0, 10.0 periodic_x = .false. periodic_y = .false. create_lbc_mesh = .true. lbc_rim_depth = 1 lbc_parent_mesh = 'mesh_A' - apply_stretch_transform = .false. + stretch_function = 'polynomial' / &partitions @@ -79,10 +78,10 @@ / &stretch_transform - cell_size_inner = 2.0, 2.0 - cell_size_outer = 3.0, 3.0 - n_cells_outer = 2, 2 + cell_size_inner = 0.0135,0.0135 + cell_size_outer = 0.036,0.036 + n_cells_outer = 5, 5 n_cells_stretch = 5, 5 - stretching_on = 'cell_centres' + poly_power = 3 transform_mesh = 'mesh_A' / diff --git a/mesh_tools/rose-meta/lfric-mesh_tools/HEAD/rose-meta.conf b/mesh_tools/rose-meta/lfric-mesh_tools/HEAD/rose-meta.conf index 9f3b12dd5..6741e7e13 100644 --- a/mesh_tools/rose-meta/lfric-mesh_tools/HEAD/rose-meta.conf +++ b/mesh_tools/rose-meta/lfric-mesh_tools/HEAD/rose-meta.conf @@ -319,16 +319,6 @@ ns=namelist/mesh/planar sort-key=Section-A03 title=Planar -[namelist:planar_mesh=apply_stretch_transform] -compulsory=true -description=Apply stretched grid transformation. -help=Enables using a larger cell spacing in the outer region of the domain, - =compared to the inner region. -!kind=default -sort-key=Panel-D01 -trigger=namelist:stretch_transform: .true.; -type=logical - [namelist:planar_mesh=create_lbc_mesh] compulsory=true description=Create LBC mesh @@ -470,6 +460,23 @@ help=Specifies whether the topology of the mesh should be periodic in the y dire sort-key=Panel-A10 type=logical +[namelist:planar_mesh=stretch_function] +compulsory=true +description=Type of stretch transformation applied to the unit mesh +!enumeration=true +help=The function applied is: + = Uniform: y = ax (uniform resolution) + = The following have a low resolution outer and a high resolution + = interior, with a stretch region in between. + = Inflation: y_n = y_n-1 + dy * inflation ** stretch + = Polynomial: y = bx + ax^n where n is the power +!kind=default +trigger=namelist:stretch_transform: this != "'uniform'"; + =namelist:stretch_transform=stretching_on: this == "'inflation'"; + =namelist:stretch_transform=poly_power: this == "'polynomial'"; +value-titles=uniform, inflation, polynomial +values='uniform','inflation','polynomial' + [namelist:rotation] compulsory=true ns=namelist/mesh/Rotation @@ -605,6 +612,17 @@ range=0: sort-key=Panel-A04 type=integer +[namelist:stretch_transform=poly_power] +compulsory=true +description=Polynomial Power +help=The polynomial stretch transform is + = y = bx + ax^n + = where n is the integer polynomial power. +!kind=default +range=2: +sort-key=Panel-A04 +type=integer + [namelist:stretch_transform=stretching_on] compulsory=true description=Locations to map stretching function diff --git a/mesh_tools/rose-meta/lfric-mesh_tools/versions.py b/mesh_tools/rose-meta/lfric-mesh_tools/versions.py index 01798ad2b..d32173775 100644 --- a/mesh_tools/rose-meta/lfric-mesh_tools/versions.py +++ b/mesh_tools/rose-meta/lfric-mesh_tools/versions.py @@ -31,3 +31,33 @@ def upgrade(self, config, meta_config=None): # Add settings return config, self.reports """ + +class vn31_t270(MacroUpgrade): + # Upgrade macro for #270 by cjohnson-pi + + BEFORE_TAG = "vn3.1" + AFTER_TAG = "vn3.1_t270" + + def upgrade(self, config, meta_config=None): + # Add settings + nml = "namelist:planar_mesh" + apply_stretch_transform = self.get_setting_value( + config, [nml, "apply_stretch_transform"]) + + if apply_stretch_transform == ".true.": + self.add_setting( + config, + [nml, "stretch_function"], + "'inflation'", + ) + else: + self.add_setting( + config, + [nml, "stretch_function"], + "'uniform'", + ) + self.remove_setting( + config, [nml, "apply_stretch_transform"] + ) + + return config, self.reports diff --git a/mesh_tools/source/planar_mesh_generator.f90 b/mesh_tools/source/planar_mesh_generator.f90 index 6ac208821..97e02165a 100644 --- a/mesh_tools/source/planar_mesh_generator.f90 +++ b/mesh_tools/source/planar_mesh_generator.f90 @@ -71,6 +71,9 @@ program planar_mesh_generator key_from_geometry use rotation_config_mod, only: ROTATION_TARGET_NULL_ISLAND, & ROTATION_TARGET_NORTH_POLE + use planar_mesh_config_mod, & + only: STRETCH_FUNCTION_INFLATION, & + STRETCH_FUNCTION_POLYNOMIAL implicit none @@ -171,11 +174,9 @@ program planar_mesh_generator logical :: periodic_y logical :: create_lbc_mesh integer(i_def) :: lbc_rim_depth + integer(i_def) :: stretch_function character(str_def) :: lbc_parent_mesh - - logical :: apply_stretch_transform - character(str_def) :: transform_mesh type(local_mesh_collection_type) :: local_mesh_collection @@ -231,17 +232,16 @@ program planar_mesh_generator topology = config%mesh%topology() geometry = config%mesh%geometry() - edge_cells_x = config%planar_mesh%edge_cells_x() - edge_cells_y = config%planar_mesh%edge_cells_y() - periodic_x = config%planar_mesh%periodic_x() - periodic_y = config%planar_mesh%periodic_y() - domain_size = config%planar_mesh%domain_size() - domain_centre = config%planar_mesh%domain_centre() - create_lbc_mesh = config%planar_mesh%create_lbc_mesh() - lbc_rim_depth = config%planar_mesh%lbc_rim_depth() - lbc_parent_mesh = config%planar_mesh%lbc_parent_mesh() - - apply_stretch_transform = config%planar_mesh%apply_stretch_transform() + edge_cells_x = config%planar_mesh%edge_cells_x() + edge_cells_y = config%planar_mesh%edge_cells_y() + periodic_x = config%planar_mesh%periodic_x() + periodic_y = config%planar_mesh%periodic_y() + domain_size = config%planar_mesh%domain_size() + domain_centre = config%planar_mesh%domain_centre() + create_lbc_mesh = config%planar_mesh%create_lbc_mesh() + lbc_rim_depth = config%planar_mesh%lbc_rim_depth() + lbc_parent_mesh = config%planar_mesh%lbc_parent_mesh() + stretch_function = config%planar_mesh%stretch_function() if (partition_mesh) then max_stencil_depth = config%partitions%max_stencil_depth() @@ -256,7 +256,8 @@ program planar_mesh_generator target_null_island = config%rotation%target_null_island() end if - if (apply_stretch_transform) then + if (stretch_function == STRETCH_FUNCTION_INFLATION .or. & + stretch_function == STRETCH_FUNCTION_POLYNOMIAL) then transform_mesh = config%stretch_transform%transform_mesh() end if @@ -413,9 +414,9 @@ program planar_mesh_generator call log_event( log_scratch_space, LOG_LEVEL_ERROR ) end if - if (apply_stretch_transform) then - ! This enables support meshes to be created with a variable - ! resolution stretching function. + ! This enables support meshes to be created with a variable + ! resolution stretching function. + if (configuration%namelist_exists('stretch_transform')) then do j=1, n_meshes if (trim(mesh_names(j)) == trim(transform_mesh)) then fine_mesh_edge_cells_x = edge_cells_x(j) @@ -748,6 +749,7 @@ program planar_mesh_generator periodic_y = periodic_y, & domain_size = domain_size, & domain_centre = domain_centre, & + stretch_function = stretch_function, & rotate_mesh = rotate_mesh, & target_north_pole = set_north_pole, & target_null_island = set_null_island ) @@ -784,6 +786,7 @@ program planar_mesh_generator fine_mesh_edge_cells_y, & periodic_x, periodic_y, & domain_size, domain_centre, & + stretch_function = stretch_function, & target_mesh_names = target_mesh_names, & target_edge_cells_x = target_edge_cells_x, & target_edge_cells_y = target_edge_cells_y, & diff --git a/mesh_tools/source/support/gen_planar_mod.F90 b/mesh_tools/source/support/gen_planar_mod.F90 index 7811a2b09..75d63b228 100644 --- a/mesh_tools/source/support/gen_planar_mod.F90 +++ b/mesh_tools/source/support/gen_planar_mod.F90 @@ -29,7 +29,9 @@ module gen_planar_mod coord_sys_ll, coord_sys_xyz, & topology_non_periodic, & geometry_spherical - use planar_mesh_config_mod, only: apply_stretch_transform + use planar_mesh_config_mod, only: stretch_function_uniform, & + stretch_function_inflation, & + stretch_function_polynomial use reference_element_mod, only: reference_element_type, & reference_cube_type, & W, S, E, N, & @@ -41,6 +43,8 @@ module gen_planar_mod TRUE_NULL_ISLAND_LL use stretch_transform_mod, only: stretch_transform, & calculate_settings + use polynomial_stretching_mod, only: polynomial_stretch, & + polynomial_parameters implicit none @@ -90,6 +94,7 @@ module gen_planar_mod integer(i_def) :: edge_cells_y integer(i_def) :: fine_mesh_edge_cells_x integer(i_def) :: fine_mesh_edge_cells_y + integer(i_def) :: stretch_function integer(i_def) :: npanels = NPANELS real(r_def) :: domain_size(2) real(r_def) :: domain_centre(2) = [0.0_r_def,0.0_r_def] @@ -212,6 +217,7 @@ function gen_planar_constructor( reference_element, & fine_mesh_edge_cells_y, & periodic_x, periodic_y, & domain_size, domain_centre, & + stretch_function, & target_mesh_names, & target_edge_cells_x, & target_edge_cells_y, & @@ -231,6 +237,7 @@ function gen_planar_constructor( reference_element, & integer(i_def), intent(in) :: edge_cells_x, edge_cells_y integer(i_def), intent(in) :: fine_mesh_edge_cells_x integer(i_def), intent(in) :: fine_mesh_edge_cells_y + integer(i_def), intent(in) :: stretch_function logical(l_def), intent(in) :: periodic_x, periodic_y real(r_def), intent(in) :: domain_size(2) real(r_def), intent(in) :: domain_centre(2) @@ -312,6 +319,7 @@ function gen_planar_constructor( reference_element, & self%edge_cells_y = edge_cells_y self%fine_mesh_edge_cells_x = fine_mesh_edge_cells_x self%fine_mesh_edge_cells_y = fine_mesh_edge_cells_y + self%stretch_function = stretch_function self%nmaps = 0_i_def self%periodic_xy(1) = periodic_x @@ -1565,10 +1573,10 @@ end subroutine assign_stretched_mesh_coords !------------------------------------------------------------------------------- -!> @brief Calculates the coordinates of vertices in the mesh.(private subroutine) +!> @brief Calculates the coordinates of vertices in the unit mesh. (private subroutine) !> @details Assigns an (x,y) coordinate in units of dx and dy to each mesh -!> vertex according to its Cartesian position in the mesh. -!> +!> vertex according to its Cartesian position in the mesh and +!> assuming a unit mesh [-1,1]. !------------------------------------------------------------------------------- subroutine calc_coords(self) @@ -1581,14 +1589,16 @@ subroutine calc_coords(self) integer(i_def) :: ncells, edge_cells_x, edge_cells_y integer(i_def) :: cell, astat, row, column - real(r_def) :: x_coord - real(r_def) :: y_coord - real(r_def) :: offset(2) + real(r_def) :: x_coord, dx + real(r_def) :: y_coord, dy edge_cells_x = self%edge_cells_x edge_cells_y = self%edge_cells_y ncells = edge_cells_x*edge_cells_y + dx = 2.0_r_def / edge_cells_x + dy = 2.0_r_def / edge_cells_y + allocate(vert_coords(2, self%n_nodes), stat=astat) if (astat /= 0) then call log_event( PREFIX//"Failure to allocate vert_coords.", & @@ -1611,41 +1621,38 @@ subroutine calc_coords(self) ! !========================================================== - self%domain_extents(:,1) = [ 0.0_r_def, -1.0_r_def*self%domain_size(2) ] - self%domain_extents(:,2) = [ self%domain_size(1), -1.0_r_def*self%domain_size(2) ] - self%domain_extents(:,3) = [ self%domain_size(1), 0.0_r_def ] - self%domain_extents(:,4) = [ 0.0_r_def, 0.0_r_def ] - - offset(1) = self%domain_centre(1) - (self%domain_size(1)*0.5_r_def) - offset(2) = self%domain_centre(2) + (self%domain_size(2)*0.5_r_def) + self%domain_extents(:,1) = [ -1.0_r_def, -1.0_r_def ] + self%domain_extents(:,2) = [ 1.0_r_def, -1.0_r_def ] + self%domain_extents(:,3) = [ 1.0_r_def, 1.0_r_def ] + self%domain_extents(:,4) = [ -1.0_r_def, 1.0_r_def ] ! The cells begin numbering in rows from NW corner of panel. cell=1 do row=1, self%edge_cells_y do column=1, self%edge_cells_x - vert_coords(1, self%verts_on_cell(NW, cell)) = (column-1) * self%dx - vert_coords(2, self%verts_on_cell(NW, cell)) = (row-1) * self%dy * (-1.0_r_def) + vert_coords(1, self%verts_on_cell(NW, cell)) = (column-1) * dx + vert_coords(2, self%verts_on_cell(NW, cell)) = (row-1) * dy * (-1.0_r_def) cell=cell+1 end do end do if (.not. self%periodic_xy(1)) then ! Vertices on east edge of panel. - x_coord = edge_cells_x*self%dx + x_coord = edge_cells_x*dx y_coord = 0.0_r_def do cell=1, size(self%east_cells) vert_coords(1, self%verts_on_cell(NE, self%east_cells(cell))) = x_coord - vert_coords(2, self%verts_on_cell(NE, self%east_cells(cell))) = y_coord - (self%dy*(cell-1)) + vert_coords(2, self%verts_on_cell(NE, self%east_cells(cell))) = y_coord - (dy*(cell-1)) end do end if ! Vertices on south edge of panel. if (.not. self%periodic_xy(2)) then x_coord = 0.0_r_def - y_coord = -1.0_r_def*edge_cells_y*self%dy + y_coord = -1.0_r_def*edge_cells_y*dy do cell=1, size(self%south_cells) - vert_coords(1, self%verts_on_cell(SW, self%south_cells(cell))) = x_coord + (self%dx*(cell-1)) + vert_coords(1, self%verts_on_cell(SW, self%south_cells(cell))) = x_coord + (dx*(cell-1)) vert_coords(2, self%verts_on_cell(SW, self%south_cells(cell))) = y_coord end do end if @@ -1653,15 +1660,12 @@ subroutine calc_coords(self) ! Coords of SE panel vertex. if (.not. self%periodic_xy(1) .and. .not. self%periodic_xy(2)) then cell=ncells - vert_coords(1, self%verts_on_cell(SE, cell)) = self%dx * self%edge_cells_x - vert_coords(2, self%verts_on_cell(SE, cell)) = self%dy * self%edge_cells_y * (-1.0_r_def) + vert_coords(1, self%verts_on_cell(SE, cell)) = dx * self%edge_cells_x + vert_coords(2, self%verts_on_cell(SE, cell)) = dy * self%edge_cells_y * (-1.0_r_def) end if - vert_coords(1,:) = vert_coords(1,:) + offset(1) - vert_coords(2,:) = vert_coords(2,:) + offset(2) - - self%domain_extents(1,:) = self%domain_extents(1,:) + offset(1) - self%domain_extents(2,:) = self%domain_extents(2,:) + offset(2) + vert_coords(1,:) = vert_coords(1,:) - 1.0_r_def + vert_coords(2,:) = vert_coords(2,:) + 1.0_r_def select case (self%coord_sys) @@ -1670,21 +1674,51 @@ subroutine calc_coords(self) self%coord_units_y = 'm' case(coord_sys_ll) - self%coord_units_x = 'radians' - self%coord_units_y = 'radians' + self%coord_units_x = 'radians' !'degrees' + self%coord_units_y = 'radians' !'degrees' case default write(log_scratch_space,'(A,I0)') & 'Unset coordinate system enumeration: ', self%coord_sys call log_event( log_scratch_space, LOG_LEVEL_ERROR ) - end select + end select - call move_alloc(vert_coords, self%vert_coords) + call move_alloc(vert_coords, self%vert_coords) return end subroutine calc_coords +!------------------------------------------------------------------------------- +!> @brief Apply a stretch transform to the vertices in the mesh.(private subroutine) +!> @details Stretch transform could be uniform, or a more complicated +!! variable resolution type with a low resolution outer and high +!! resolution inner. +!> +!------------------------------------------------------------------------------- +subroutine stretch_coords(self) + + implicit none + + class(gen_planar_type), intent(inout) :: self + + select case (self%stretch_function) + case (stretch_function_uniform) + call apply_uniform_resolution(self) + + case (stretch_function_polynomial) + call apply_polynomial_stretch(self) + + case (stretch_function_inflation) + call log_event( "stretch_function inflation is not a transformation", & + LOG_LEVEL_ERROR ) + + case default + call log_event( "Unrecognised value of stretch_function", & + LOG_LEVEL_ERROR ) + end select + +end subroutine stretch_coords !------------------------------------------------------------------------------- !> @brief Get the global cell id at a specified corner of the planar domain. @@ -1927,10 +1961,15 @@ subroutine generate(self) if (self%nmaps > 0) call calc_global_mesh_maps(self) - if (apply_stretch_transform) then + ! Use a different routine if the mesh stretching is applied + ! at the same time that the mesh is generated. Otherwise use + ! calc_coords to generate a unit mesh and then apply a stretching + ! transform. + if (self%stretch_function == stretch_function_inflation) then call assign_stretched_mesh_coords(self) else call calc_coords(self) + call stretch_coords(self) end if ! NOTE that due to the way cell centres are calculated for periodic meshes @@ -2450,4 +2489,89 @@ subroutine set_partition_parameters( decomposition, partitioner_ptr ) end subroutine set_partition_parameters +!------------------------------------------------------------------------------ +!> @brief Apply the uniform resolution stretching to the unit mesh coordinates +!------------------------------------------------------------------------------ +subroutine apply_uniform_resolution(self) + + implicit none + + class(gen_planar_type), intent(inout) :: self + + real(r_def) :: dx, param_a + integer(i_def) :: direction + + do direction = 1, 2 + + ! Calculate the cell spacing, scaling and number of points of unit mesh + if ( direction == 1 ) then + dx = 2.0_r_def / self%edge_cells_x + param_a = self%dx / dx + else + dx = 2.0_r_def / self%edge_cells_y + param_a = self%dy / dx + end if + + ! Apply the scaling transformation to each coordinate and add on the domain centre + self%domain_extents(direction,:) = param_a * self%domain_extents(direction,:) + self%domain_centre(direction) + self%vert_coords(direction,:) = param_a * self%vert_coords(direction,:) + self%domain_centre(direction) + end do + + return + +end subroutine apply_uniform_resolution + +!------------------------------------------------------------------------------- +!> @brief Apply the polynomial stretching to the unit mesh coordinates +!------------------------------------------------------------------------------- +subroutine apply_polynomial_stretch(self) + + implicit none + + class(gen_planar_type), intent(inout) :: self + + real(r_def) :: dx, param_a, param_b, param_c, x_inner, x_outer + integer(i_def) :: nverts, vert, direction + + do direction = 1, 2 + + ! Calculate the cell spacing and number of points of unit mesh + ! of the fine mesh (fine mesh needed in case this is stretching + ! a multigrid mesh), + if ( direction == 1 ) then + dx = 2.0_r_def / self%fine_mesh_edge_cells_x + else + dx = 2.0_r_def / self%fine_mesh_edge_cells_y + end if + + nverts = size(self%vert_coords(direction, :)) + + ! Calculate the parameters required for the stretching transform + call polynomial_parameters( param_a, param_b, param_c, & + x_inner, x_outer, dx, direction ) + + ! Apply the stretching transformation to each coordinate + do vert = 1, nverts + + self%vert_coords(direction, vert) = & + polynomial_stretch(self%vert_coords(direction, vert), & + param_a, param_b, param_c, x_inner, x_outer ) & + + self%domain_centre(direction) + + end do + + ! Apply the stretching transformation to the domain extents + do vert = 1,4 + self%domain_extents(direction, vert) = & + polynomial_stretch(self%domain_extents(direction, vert), & + param_a, param_b, param_c, x_inner, x_outer ) & + + self%domain_centre(direction) + end do + + end do + + return + +end subroutine apply_polynomial_stretch + end module gen_planar_mod diff --git a/mesh_tools/source/support/polynomial_stretching_mod.F90 b/mesh_tools/source/support/polynomial_stretching_mod.F90 new file mode 100644 index 000000000..5315fa905 --- /dev/null +++ b/mesh_tools/source/support/polynomial_stretching_mod.F90 @@ -0,0 +1,152 @@ +!----------------------------------------------------------------------------- +! (C) Crown copyright 2026 Met Office. All rights reserved. +! The file LICENCE, distributed with this code, contains details of the terms +! under which the code may be used. +!----------------------------------------------------------------------------- + +!> @brief Module to define a coordinate transformation for a stretched +!! regional mesh. +!> @details The coordinate transformation is defined using a polynomial +!! function. +!> +module polynomial_stretching_mod + + use constants_mod, only: r_def, i_def, l_def + use stretch_transform_config_mod, & + only : cell_size_outer, & + cell_size_inner, & + n_cells_stretch, & + n_cells_outer, & + poly_power + implicit none + + public :: polynomial_stretch, & + polynomial_parameters + +contains + +!> @brief Calculate the polynomial stretching parameters +!> @details In inner y = b x, in stretch y = a (x - xi) ^n + b x +!! and in outer y = yo + c (x - xo). +!> @param param_a Parameter a +!> @param param_b Parameter b +!> @param param_c Parameter c +!> @param x_inner Unit mesh coordinate betwen inner and stretch +!> @param x_outer Unit mesh coordinate between stretch and outer +!> @param dx Unit mesh cell size +!> @param direction North-south or East-west +subroutine polynomial_parameters( param_a, param_b, param_c, & + x_inner, x_outer, dx, direction ) + + implicit none + + real(r_def), intent(inout) :: param_a, param_b, param_c, x_inner, x_outer + real(r_def), intent(in) :: dx + integer(i_def), intent(in) :: direction + + real(r_def) :: l_stretch + + ! Given the coordinates x defined on [-1,1] with mesh size dx, + ! define new coordinates y such that in the outer and inner regions, + ! the spacing is cell_size_outer and cell_size_inner and in the + ! stretch region (in between the inner and outer) the coordinates + ! satisfy y = a ( x - xi) ^n + b x where xi is the boundary between the + ! inner and stretch region. + + ! We assume that the mesh is symmetrical and centred on (0,0) + ! | OUTER | STRETCH | INNER | STRETCH | OUTER | + + ! Considering the region [0,1], define the edges of the stretch region + x_outer = 1.0_r_def - ( n_cells_outer(direction) * dx ) + x_inner = 1.0_r_def - ( ( n_cells_outer(direction) + & + n_cells_stretch(direction) ) * dx ) + + ! Define the total size or length of the stretch region + l_stretch = ( x_outer - x_inner ) + + ! In outer region y = c (x -xo) + ! y' = c so c = target cell_size / dx + + param_c = cell_size_outer(direction) / dx + + ! In inner region and at x = xi (between inner and stretch) + ! y' = b so b = target cell_size /dx + + param_b = cell_size_inner(direction) / dx + + ! In stretch region y = a (x - xi) ^n + bx + ! Derivative y' = n a (x - xi) ^(n-1) + b + ! At x = xo (between stretch and outer), where xo - xi = l + ! Set n a (x - xi) ^(n-1) + b = c + ! So a = (c - b) / ( n l ^(n-1) ) + + param_a = ( param_c - param_b ) / & + ( poly_power * l_stretch ** (poly_power - 1_i_def) ) + +end subroutine polynomial_parameters + +!> @brief Apply a polynomial stretching transformation to a given coordinate +!> @details In inner y = b x, in stretch y = a (x - xi) ^n + b x +!! and in outer y = yo + c x +!> @param param_a Parameter a +!> @param param_b Parameter b +!> @param param_c Parameter c +!> @param x_inner Unit mesh coordinate betwen inner and stretch +!> @param x_outer Unit mesh coordinate between stretch and outer +!> @param dx Unit mesh cell size +!> @param direction North-south or East-west +function polynomial_stretch( x_coord, param_a, param_b, param_c, & + x_inner, x_outer ) & + result( y_coord ) + + implicit none + + real(r_def), intent(in) :: x_coord + real(r_def), intent(in) :: param_a, param_b, param_c, x_inner, x_outer + + real(r_def) :: y_coord, y_outer, l_stretch, new_x_coord + + logical(l_def) :: use_symmetry + + ! Define the total size or length of the stretch region + l_stretch = x_outer - x_inner + + ! Define a useful constant that describes the new coordinate at the + ! point between the stretch and outer regions. + y_outer = ( param_a * l_stretch ** poly_power ) + & + ( param_b * x_outer ) + + ! Use symmetry to define coords < 0 + if ( x_coord < 0.0_r_def ) then + use_symmetry = .true. + new_x_coord = -1.0_r_def * x_coord + else + use_symmetry= .false. + new_x_coord = x_coord + end if + + ! Assign new coordinates using transform y=f(x) + if ( new_x_coord < x_inner ) then + ! In inner y = b x + y_coord = param_b * new_x_coord + + else if ( new_x_coord >= x_inner .and. new_x_coord < x_outer ) then + ! In stretch y = a (x - xi) ^n + bx where a (x - xi) ^n >0 + y_coord = param_b * new_x_coord + & + param_a * ( new_x_coord - x_inner ) ** poly_power + + else + ! In outer y = c (x - xo) + yo + y_coord = param_c * ( new_x_coord - x_outer ) + y_outer + end if + + ! To define coords <0 + if ( use_symmetry ) then + y_coord = -1.0_r_def * y_coord + end if + + return + +end function polynomial_stretch + +end module polynomial_stretching_mod diff --git a/mesh_tools/unit-test/calc_global_cell_map_mod_test.pf b/mesh_tools/unit-test/calc_global_cell_map_mod_test.pf index a76755de9..41770a671 100644 --- a/mesh_tools/unit-test/calc_global_cell_map_mod_test.pf +++ b/mesh_tools/unit-test/calc_global_cell_map_mod_test.pf @@ -24,6 +24,7 @@ module calc_global_cell_map_mod_test topology_channel, & coord_sys_xyz, & coord_sys_ll + use planar_mesh_config_mod, only: stretch_function_uniform implicit none @@ -198,6 +199,7 @@ contains periodic_y = .true., & domain_size = this%domain_size, & domain_centre= this%domain_centre, & + stretch_function = stretch_function_uniform, & coord_sys = coord_sys_xyz ) mesh_name = 'fine_plane_bi' @@ -216,6 +218,7 @@ contains periodic_y = .true., & domain_size = this%domain_size, & domain_centre= this%domain_centre, & + stretch_function = stretch_function_uniform, & coord_sys = coord_sys_xyz ) @@ -236,6 +239,7 @@ contains periodic_y = .false., & domain_size = this%domain_size, & domain_centre= this%domain_centre, & + stretch_function = stretch_function_uniform, & coord_sys = coord_sys_xyz ) @@ -255,6 +259,7 @@ contains periodic_y = .false., & domain_size = this%domain_size, & domain_centre= this%domain_centre, & + stretch_function = stretch_function_uniform, & coord_sys = coord_sys_xyz ) mesh_name = 'coarse_plane_periodic_y' @@ -273,6 +278,7 @@ contains periodic_y = .true., & domain_size = this%domain_size, & domain_centre= this%domain_centre, & + stretch_function = stretch_function_uniform, & coord_sys = coord_sys_xyz ) @@ -292,6 +298,7 @@ contains periodic_y = .true., & domain_size = this%domain_size, & domain_centre= this%domain_centre, & + stretch_function = stretch_function_uniform, & coord_sys = coord_sys_xyz ) return diff --git a/mesh_tools/unit-test/gen_lbc_mod_test.pf b/mesh_tools/unit-test/gen_lbc_mod_test.pf index 2ace21d27..a48df12e1 100644 --- a/mesh_tools/unit-test/gen_lbc_mod_test.pf +++ b/mesh_tools/unit-test/gen_lbc_mod_test.pf @@ -21,6 +21,7 @@ module gen_lbc_mod_test use mesh_config_mod, only: coord_sys_xyz, & geometry_planar, & topology_non_periodic + use planar_mesh_config_mod, only: stretch_function_uniform use funit @@ -248,6 +249,7 @@ contains fine_mesh_edge_cells_y=edge_cells_y, & domain_size=domain_size, & domain_centre=domain_centre, & + stretch_function=stretch_function_uniform, & periodic_x=periodic_x, & periodic_y=periodic_y ) @@ -411,6 +413,7 @@ contains periodic_y=periodic_y, & domain_size=domain_size, & domain_centre=domain_centre, & + stretch_function=stretch_function_uniform, & edge_cells_x=edge_cells_x, & edge_cells_y=edge_cells_y , & fine_mesh_edge_cells_x=edge_cells_x, & @@ -550,6 +553,7 @@ contains fine_mesh_edge_cells_y=edge_cells_y, & domain_size=domain_size, & domain_centre=domain_centre, & + stretch_function=stretch_function_uniform, & periodic_x=periodic_x, & periodic_y=periodic_y ) diff --git a/mesh_tools/unit-test/gen_planar_mod_test_cartesian.pf b/mesh_tools/unit-test/gen_planar_mod_test_cartesian.pf index c5bf01509..6f88c2b66 100644 --- a/mesh_tools/unit-test/gen_planar_mod_test_cartesian.pf +++ b/mesh_tools/unit-test/gen_planar_mod_test_cartesian.pf @@ -33,6 +33,8 @@ module gen_planar_mod_test_cartesian topology_channel, & topology_periodic + use planar_mesh_config_mod, only: stretch_function_uniform + implicit none private @@ -1277,6 +1279,7 @@ contains fine_mesh_edge_cells_y=context%y_size, & periodic_x=context%x_periodic, & periodic_y=context%y_periodic, & + stretch_function=stretch_function_uniform, & domain_size=context%domain_size, & domain_centre=context%domain_centre ) diff --git a/mesh_tools/unit-test/gen_planar_mod_test_spherical.pf b/mesh_tools/unit-test/gen_planar_mod_test_spherical.pf index 94b2c99ff..8142d04bf 100644 --- a/mesh_tools/unit-test/gen_planar_mod_test_spherical.pf +++ b/mesh_tools/unit-test/gen_planar_mod_test_spherical.pf @@ -30,6 +30,8 @@ module gen_planar_mod_test_spherical geometry_spherical, & topology_non_periodic + use planar_mesh_config_mod, only: stretch_function_uniform + implicit none private @@ -327,6 +329,7 @@ contains periodic_y=context%y_periodic, & domain_size=context%domain_size, & domain_centre=context%domain_centre, & + stretch_function=stretch_function_uniform, & rotate_mesh=context%rotate_mesh, & target_north_pole=context%target_north_pole, & target_null_island=context%target_null_island ) diff --git a/rose-stem/app/mesh_tools/opt/rose-app-var-poly-seuk.conf b/rose-stem/app/mesh_tools/opt/rose-app-var-poly-seuk.conf new file mode 100644 index 000000000..6752c43c2 --- /dev/null +++ b/rose-stem/app/mesh_tools/opt/rose-app-var-poly-seuk.conf @@ -0,0 +1,27 @@ +[namelist:mesh] +coord_sys='ll' +geometry='spherical' +!!mesh_maps='' +mesh_names='dynamics' +n_meshes=1 +rotate_mesh=.true. +topology='non_periodic' + +[namelist:planar_mesh] +domain_centre=1.2,-1.2 +edge_cells_x=64 +edge_cells_y=64 +periodic_x=.false. +periodic_y=.false. +stretch_function='polynomial' + +[namelist:rotation] +target_north_pole=177.5,37.5 + +[namelist:stretch_transform] +cell_size_inner=0.0135,0.0135 +cell_size_outer=0.036,0.036 +n_cells_outer=5,5 +n_cells_stretch=18,18 +poly_power=3 +transform_mesh='dynamics' diff --git a/rose-stem/site/common/mesh_tools/tasks_mesh_tools.cylc b/rose-stem/site/common/mesh_tools/tasks_mesh_tools.cylc index 8e4e6d850..590b6ae96 100644 --- a/rose-stem/site/common/mesh_tools/tasks_mesh_tools.cylc +++ b/rose-stem/site/common/mesh_tools/tasks_mesh_tools.cylc @@ -41,6 +41,7 @@ task_ns.conf_name == "nzlam4" or task_ns.conf_name == "falklands" or task_ns.conf_name == "var-seuk" or + task_ns.conf_name == "var-poly-seuk" or task_ns.conf_name == "planar-lbc" or task_ns.conf_name == "planar-maps" or task_ns.conf_name == "planar-stretch-centres" or diff --git a/rose-stem/site/meto/groups/group_mesh_tools.cylc b/rose-stem/site/meto/groups/group_mesh_tools.cylc index 64e88682f..2396f7dd0 100644 --- a/rose-stem/site/meto/groups/group_mesh_tools.cylc +++ b/rose-stem/site/meto/groups/group_mesh_tools.cylc @@ -80,6 +80,7 @@ "mesh_tools_nzlam4_azspice_gnu_fast-debug-64bit", "mesh_tools_falklands_azspice_gnu_fast-debug-64bit", "mesh_tools_var-seuk_azspice_gnu_fast-debug-64bit", + "mesh_tools_var-poly-seuk_azspice_gnu_fast-debug-64bit", "mesh_tools_planar-lbc_azspice_gnu_fast-debug-64bit", "mesh_tools_planar-maps_azspice_gnu_fast-debug-64bit", "mesh_tools_planar-stretch-centres_azspice_gnu_fast-debug-64bit", @@ -101,6 +102,7 @@ "mesh_tools_nzlam4_azspice_gnu_full-debug-64bit", "mesh_tools_falklands_azspice_gnu_full-debug-64bit", "mesh_tools_var-seuk_azspice_gnu_full-debug-64bit", + "mesh_tools_var-poly-seuk_azspice_gnu_full-debug-64bit", "mesh_tools_planar-lbc_azspice_gnu_full-debug-64bit", "mesh_tools_planar-maps_azspice_gnu_full-debug-64bit", "mesh_tools_planar-stretch-centres_azspice_gnu_full-debug-64bit", @@ -150,6 +152,7 @@ "mesh_tools_nzlam4_ex1a_cce_fast-debug-64bit", "mesh_tools_falklands_ex1a_cce_fast-debug-64bit", "mesh_tools_var-seuk_ex1a_gnu_fast-debug-64bit", + "mesh_tools_var-poly-seuk_ex1a_gnu_fast-debug-64bit", "mesh_tools_planar-lbc_ex1a_cce_fast-debug-64bit", "mesh_tools_planar-maps_ex1a_cce_fast-debug-64bit", "mesh_tools_planar-stretch-centres_ex1a_cce_fast-debug-64bit", diff --git a/rose-stem/site/meto/kgos/lbc_demo/azspice/checksum_lbc_demo_OutputOnLBC-lbc_azspice_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/lbc_demo/azspice/checksum_lbc_demo_OutputOnLBC-lbc_azspice_gnu_fast-debug-64bit.txt index ad76d26dc..5957ec9b5 100644 --- a/rose-stem/site/meto/kgos/lbc_demo/azspice/checksum_lbc_demo_OutputOnLBC-lbc_azspice_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/lbc_demo/azspice/checksum_lbc_demo_OutputOnLBC-lbc_azspice_gnu_fast-debug-64bit.txt @@ -1,7 +1,7 @@ Inner product checksum w3_2d_field = 4117724000000000 Inner product checksum wtheta_field = 4137724000000000 Inner product checksum multi_data_field = 4127724000000000 -Inner product checksum w0_field = 413748C400000000 +Inner product checksum w0_field = 4137488400000000 Inner product checksum w3_field = 413195B000000000 Inner product checksum w2h_field = 414187F400000000 Inner product checksum w2v_field = 4137724000000000 diff --git a/rose-stem/site/meto/kgos/lbc_demo/azspice/checksum_lbc_demo_OutputOnLBC-lbc_azspice_gnu_full-debug-64bit.txt b/rose-stem/site/meto/kgos/lbc_demo/azspice/checksum_lbc_demo_OutputOnLBC-lbc_azspice_gnu_full-debug-64bit.txt index ad76d26dc..5957ec9b5 100644 --- a/rose-stem/site/meto/kgos/lbc_demo/azspice/checksum_lbc_demo_OutputOnLBC-lbc_azspice_gnu_full-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/lbc_demo/azspice/checksum_lbc_demo_OutputOnLBC-lbc_azspice_gnu_full-debug-64bit.txt @@ -1,7 +1,7 @@ Inner product checksum w3_2d_field = 4117724000000000 Inner product checksum wtheta_field = 4137724000000000 Inner product checksum multi_data_field = 4127724000000000 -Inner product checksum w0_field = 413748C400000000 +Inner product checksum w0_field = 4137488400000000 Inner product checksum w3_field = 413195B000000000 Inner product checksum w2h_field = 414187F400000000 Inner product checksum w2v_field = 4137724000000000 diff --git a/rose-stem/site/meto/kgos/lbc_demo/azspice/checksum_lbc_demo_default-lbc_azspice_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/lbc_demo/azspice/checksum_lbc_demo_default-lbc_azspice_gnu_fast-debug-64bit.txt index ad76d26dc..5957ec9b5 100644 --- a/rose-stem/site/meto/kgos/lbc_demo/azspice/checksum_lbc_demo_default-lbc_azspice_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/lbc_demo/azspice/checksum_lbc_demo_default-lbc_azspice_gnu_fast-debug-64bit.txt @@ -1,7 +1,7 @@ Inner product checksum w3_2d_field = 4117724000000000 Inner product checksum wtheta_field = 4137724000000000 Inner product checksum multi_data_field = 4127724000000000 -Inner product checksum w0_field = 413748C400000000 +Inner product checksum w0_field = 4137488400000000 Inner product checksum w3_field = 413195B000000000 Inner product checksum w2h_field = 414187F400000000 Inner product checksum w2v_field = 4137724000000000 diff --git a/rose-stem/site/meto/kgos/lbc_demo/azspice/checksum_lbc_demo_default-lbc_azspice_gnu_full-debug-64bit.txt b/rose-stem/site/meto/kgos/lbc_demo/azspice/checksum_lbc_demo_default-lbc_azspice_gnu_full-debug-64bit.txt index ad76d26dc..5957ec9b5 100644 --- a/rose-stem/site/meto/kgos/lbc_demo/azspice/checksum_lbc_demo_default-lbc_azspice_gnu_full-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/lbc_demo/azspice/checksum_lbc_demo_default-lbc_azspice_gnu_full-debug-64bit.txt @@ -1,7 +1,7 @@ Inner product checksum w3_2d_field = 4117724000000000 Inner product checksum wtheta_field = 4137724000000000 Inner product checksum multi_data_field = 4127724000000000 -Inner product checksum w0_field = 413748C400000000 +Inner product checksum w0_field = 4137488400000000 Inner product checksum w3_field = 413195B000000000 Inner product checksum w2h_field = 414187F400000000 Inner product checksum w2v_field = 4137724000000000 diff --git a/rose-stem/site/meto/kgos/lbc_demo/ex1a/checksum_lbc_demo_OutputOnLBC-lbc_1x1P_ex1a_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/lbc_demo/ex1a/checksum_lbc_demo_OutputOnLBC-lbc_1x1P_ex1a_gnu_fast-debug-64bit.txt index ad76d26dc..5957ec9b5 100644 --- a/rose-stem/site/meto/kgos/lbc_demo/ex1a/checksum_lbc_demo_OutputOnLBC-lbc_1x1P_ex1a_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/lbc_demo/ex1a/checksum_lbc_demo_OutputOnLBC-lbc_1x1P_ex1a_gnu_fast-debug-64bit.txt @@ -1,7 +1,7 @@ Inner product checksum w3_2d_field = 4117724000000000 Inner product checksum wtheta_field = 4137724000000000 Inner product checksum multi_data_field = 4127724000000000 -Inner product checksum w0_field = 413748C400000000 +Inner product checksum w0_field = 4137488400000000 Inner product checksum w3_field = 413195B000000000 Inner product checksum w2h_field = 414187F400000000 Inner product checksum w2v_field = 4137724000000000 diff --git a/rose-stem/site/meto/kgos/lbc_demo/ex1a/checksum_lbc_demo_OutputOnLBC-lbc_2x2P_ex1a_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/lbc_demo/ex1a/checksum_lbc_demo_OutputOnLBC-lbc_2x2P_ex1a_gnu_fast-debug-64bit.txt index ad76d26dc..5957ec9b5 100644 --- a/rose-stem/site/meto/kgos/lbc_demo/ex1a/checksum_lbc_demo_OutputOnLBC-lbc_2x2P_ex1a_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/lbc_demo/ex1a/checksum_lbc_demo_OutputOnLBC-lbc_2x2P_ex1a_gnu_fast-debug-64bit.txt @@ -1,7 +1,7 @@ Inner product checksum w3_2d_field = 4117724000000000 Inner product checksum wtheta_field = 4137724000000000 Inner product checksum multi_data_field = 4127724000000000 -Inner product checksum w0_field = 413748C400000000 +Inner product checksum w0_field = 4137488400000000 Inner product checksum w3_field = 413195B000000000 Inner product checksum w2h_field = 414187F400000000 Inner product checksum w2v_field = 4137724000000000 diff --git a/rose-stem/site/meto/kgos/lbc_demo/ex1a/checksum_lbc_demo_OutputOnLBC-lbc_8x2P_ex1a_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/lbc_demo/ex1a/checksum_lbc_demo_OutputOnLBC-lbc_8x2P_ex1a_gnu_fast-debug-64bit.txt index ad76d26dc..5957ec9b5 100644 --- a/rose-stem/site/meto/kgos/lbc_demo/ex1a/checksum_lbc_demo_OutputOnLBC-lbc_8x2P_ex1a_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/lbc_demo/ex1a/checksum_lbc_demo_OutputOnLBC-lbc_8x2P_ex1a_gnu_fast-debug-64bit.txt @@ -1,7 +1,7 @@ Inner product checksum w3_2d_field = 4117724000000000 Inner product checksum wtheta_field = 4137724000000000 Inner product checksum multi_data_field = 4127724000000000 -Inner product checksum w0_field = 413748C400000000 +Inner product checksum w0_field = 4137488400000000 Inner product checksum w3_field = 413195B000000000 Inner product checksum w2h_field = 414187F400000000 Inner product checksum w2v_field = 4137724000000000 diff --git a/rose-stem/site/meto/kgos/lbc_demo/ex1a/checksum_lbc_demo_default-lbc_ex1a_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/lbc_demo/ex1a/checksum_lbc_demo_default-lbc_ex1a_gnu_fast-debug-64bit.txt index ad76d26dc..5957ec9b5 100644 --- a/rose-stem/site/meto/kgos/lbc_demo/ex1a/checksum_lbc_demo_default-lbc_ex1a_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/lbc_demo/ex1a/checksum_lbc_demo_default-lbc_ex1a_gnu_fast-debug-64bit.txt @@ -1,7 +1,7 @@ Inner product checksum w3_2d_field = 4117724000000000 Inner product checksum wtheta_field = 4137724000000000 Inner product checksum multi_data_field = 4127724000000000 -Inner product checksum w0_field = 413748C400000000 +Inner product checksum w0_field = 4137488400000000 Inner product checksum w3_field = 413195B000000000 Inner product checksum w2h_field = 414187F400000000 Inner product checksum w2v_field = 4137724000000000 diff --git a/rose-stem/site/meto/kgos/mesh_tools/azspice/mesh_planar-non-periodic.gnu.kgo.nc b/rose-stem/site/meto/kgos/mesh_tools/azspice/mesh_planar-non-periodic.gnu.kgo.nc index f67e7d9f9..347f03ceb 100644 Binary files a/rose-stem/site/meto/kgos/mesh_tools/azspice/mesh_planar-non-periodic.gnu.kgo.nc and b/rose-stem/site/meto/kgos/mesh_tools/azspice/mesh_planar-non-periodic.gnu.kgo.nc differ diff --git a/rose-stem/site/meto/kgos/mesh_tools/azspice/mesh_var-poly-seuk.gnu.kgo.nc b/rose-stem/site/meto/kgos/mesh_tools/azspice/mesh_var-poly-seuk.gnu.kgo.nc new file mode 100644 index 000000000..f85281f5b Binary files /dev/null and b/rose-stem/site/meto/kgos/mesh_tools/azspice/mesh_var-poly-seuk.gnu.kgo.nc differ diff --git a/rose-stem/site/meto/kgos/mesh_tools/ex1a/mesh_planar-non-periodic.cce.kgo.nc b/rose-stem/site/meto/kgos/mesh_tools/ex1a/mesh_planar-non-periodic.cce.kgo.nc index f67e7d9f9..347f03ceb 100644 Binary files a/rose-stem/site/meto/kgos/mesh_tools/ex1a/mesh_planar-non-periodic.cce.kgo.nc and b/rose-stem/site/meto/kgos/mesh_tools/ex1a/mesh_planar-non-periodic.cce.kgo.nc differ diff --git a/rose-stem/site/meto/kgos/mesh_tools/ex1a/mesh_var-poly-seuk.gnu.kgo.nc b/rose-stem/site/meto/kgos/mesh_tools/ex1a/mesh_var-poly-seuk.gnu.kgo.nc new file mode 100644 index 000000000..b92ae33a1 Binary files /dev/null and b/rose-stem/site/meto/kgos/mesh_tools/ex1a/mesh_var-poly-seuk.gnu.kgo.nc differ