diff --git a/Tests/test_get_1_outerm.f b/Tests/test_get_1_outerm.f index 2adec74419b6ce2a8943e966a22807ad494f4107..7fdde8807f866920430d955af2509cac13be763c 100644 --- a/Tests/test_get_1_outerm.f +++ b/Tests/test_get_1_outerm.f @@ -29,9 +29,8 @@ program test_get_1_outerm type(ssh_contour) outermost_contour TYPE(shpfileobject) shphandle integer field_number, shape_number - real:: ssh_extremum = 0.2759 - namelist /main_nml/ ind_targ_extr, ssh_extremum, innermost_level, cyclone + namelist /main_nml/ ind_targ_extr, innermost_level, cyclone !---------------------------------------------------------------- @@ -70,7 +69,7 @@ program test_get_1_outerm call nf95_close(ncid) step = [longitude(2) - longitude(1), latitude(2) - latitude(1)] - outermost_contour = get_1_outerm(ssh_extremum, cyclone, & + outermost_contour = get_1_outerm(cyclone, & coord_extr = [longitude(1), latitude(1)] + (ind_targ_extr - 1) * step, & i = extr_map(ind_targ_extr(1), ind_targ_extr(2)), & innermost_level = innermost_level, extr_map = extr_map, ssh = ssh, & diff --git a/derived_types.f b/derived_types.f index dc3f47f3d04a61c389f39ab21938711406f97ae9..073deec2d454499be5a7c2359335e0f55e88f901 100644 --- a/derived_types.f +++ b/derived_types.f @@ -58,4 +58,20 @@ module derived_types integer number_eddies ! number of eddies, including interpolated eddies end type snapshot + real, parameter:: missing_ssh = 1e4 ! flag for undefined contour + +contains + + pure type(ssh_contour) function null_ssh_contour() + + use contour_531, only: null_polyline + + !-------------------------------------------------------------- + + null_ssh_contour%polyline = null_polyline() + null_ssh_contour%ssh = missing_ssh + null_ssh_contour%area = 0. + + end function null_ssh_contour + end module derived_types diff --git a/get_1_outerm.f b/get_1_outerm.f index cbb2bd2ae1c5e1a6524c56f55936aa5e8122ba85..09e66bccd87f03a8c38f0c1609ef32491a585097 100644 --- a/get_1_outerm.f +++ b/get_1_outerm.f @@ -4,24 +4,23 @@ module get_1_outerm_m contains - type(ssh_contour) function get_1_outerm(ssh_extremum, cyclone, coord_extr, & - i, innermost_level, extr_map, ssh, corner, step) + type(ssh_contour) function get_1_outerm(cyclone, coord_extr, i, & + innermost_level, extr_map, ssh, corner, step) ! Gets one outermost contour, if it can find one. Method: ! dichotomy on level of ssh. If the procedure cannot find an ! outermost contour, it return a null polyline, zero area and ssh - ! equal to ssh extremum. An outermost contour is not found if, and + ! equal to missing_ssh. An outermost contour is not found if, and ! only if, there is no good contour at innermost level. use contour_531, only: polyline, convert_to_reg_coord - use derived_types, only: ssh_contour + use derived_types, only: ssh_contour, missing_ssh use good_contour_m, only: good_contour use jumble, only: argwhere, pack_indices use nr_util, only: assert use outermost_possible_level_m, only: outermost_possible_level use spherical_polygon_area_m, only: spherical_polygon_area - real, intent(in):: ssh_extremum logical, intent(in):: cyclone real, intent(in):: coord_extr(:) ! (2) @@ -30,7 +29,9 @@ contains ! at coord_extr real, intent(in):: innermost_level - ! ssh level of the innermost contour around the target extremum, in m + ! ssh level of the innermost contour around the target extremum, + ! in m. By construction, innermost_level < extremum for a maximum, + ! > extremum for a minimum. integer, intent(in):: extr_map(:, :) real, intent(in):: ssh(:, :) ! in m @@ -60,14 +61,15 @@ contains coord_extr, nearby_extr) if (get_1_outerm%n_points == 0) then - get_1_outerm%ssh = ssh_extremum + ! null ssh contour + get_1_outerm%ssh = missing_ssh get_1_outerm%area = 0. else level_good = innermost_level mask = ssh /= huge(0.) level_try = merge(maxval(ssh, mask), minval(ssh, mask), cyclone) - call assert((level_try - ssh_extremum) & - / (level_good - ssh_extremum) > 1., "get_1_outerm level_try") + call assert(merge(level_try > level_good, level_try < level_good, & + cyclone), "get_1_outerm level_try") tentative_contour = good_contour(corner, step, ssh, level_try, & coord_extr, nearby_extr) diff --git a/get_snapshot.f b/get_snapshot.f index a47981658ce57a5731e2c94a8ad7e94ab62b421a..032775bbaeeb59a6d5a235ce395a1ddcd6919e8b 100644 --- a/get_snapshot.f +++ b/get_snapshot.f @@ -10,7 +10,7 @@ contains use, intrinsic:: ieee_arithmetic, only: ieee_value, IEEE_QUIET_NAN use contour_531, only: convert_to_ind, null_polyline - use derived_types, only: snapshot + use derived_types, only: snapshot, null_ssh_contour use netcdf, only: nf90_nowrite use netcdf95, only: nf95_open, nf95_close, nf95_inq_varid, nf95_get_var, & nf95_get_att @@ -102,9 +102,7 @@ contains v(llc(1):urc(1), llc(2):urc(2)), corner + (llc - 1) * step, & step) else - s%list_vis(i)%speed_cont%polyline = null_polyline() - s%list_vis(i)%speed_cont%ssh = s%list_vis(i)%ssh_extr - s%list_vis(i)%speed_cont%area = 0. + s%list_vis(i)%speed_cont = null_ssh_contour() s%list_vis(i)%max_speed = 0. s%list_vis(i)%radius4 = 0 end if diff --git a/set_all_outerm.f b/set_all_outerm.f index 6a3aa92da0b96ff2bd4ec968f1f0c7a6ba607bde..c65035bc909bd70d184de7ec8cbb6897649fb77e 100644 --- a/set_all_outerm.f +++ b/set_all_outerm.f @@ -34,7 +34,9 @@ contains ! Local: real, allocatable:: innermost_level(:) ! (s%number_vis_eddies) - ! level of innermost contour, for each extremum + ! ssh level of the innermost contour around each extremum, in + ! m. By construction, innermost_level < extremum for a maximum, > + ! extremum for a minimum. logical, allocatable:: cyclone(:) ! (s%number_vis_eddies) integer i @@ -84,9 +86,8 @@ contains do i = 1, s%number_vis_eddies if (flat_extr(i)) then - s%list_vis(i)%out_cont = get_1_outerm(s%list_vis(i)%ssh_extr, & - s%list_vis(i)%cyclone, s%list_vis(i)%coord_extr, i, & - innermost_level(i), & + s%list_vis(i)%out_cont = get_1_outerm(s%list_vis(i)%cyclone, & + s%list_vis(i)%coord_extr, i, innermost_level(i), & s%extr_map(llc(1, i):urc(1, i), llc(2, i):urc(2, i)), & ssh(llc(1, i):urc(1, i), llc(2, i):urc(2, i)), & corner_window(:, i), step) @@ -122,9 +123,8 @@ contains do i = 1, s%number_vis_eddies if (s%list_vis(i)%suff_amp .and. noise_around(i) & .or. .not. flat_extr(i)) then - s%list_vis(i)%out_cont = get_1_outerm(s%list_vis(i)%ssh_extr, & - s%list_vis(i)%cyclone, s%list_vis(i)%coord_extr, i, & - innermost_level(i), & + s%list_vis(i)%out_cont = get_1_outerm(s%list_vis(i)%cyclone, & + s%list_vis(i)%coord_extr, i, innermost_level(i), & s%extr_map(llc(1, i):urc(1, i), llc(2, i):urc(2, i)), & ssh(llc(1, i):urc(1, i), llc(2, i):urc(2, i)), & corner_window(:, i), step) diff --git a/set_max_speed.f b/set_max_speed.f index e4c10ba0d985e4f1a2673c9309a0a44b702219ab..135362cfc3181943efda46b027c96c396e301f45 100644 --- a/set_max_speed.f +++ b/set_max_speed.f @@ -11,7 +11,7 @@ contains use, intrinsic:: IEEE_ARITHMETIC, only: IEEE_IS_NAN use contour_531, only: convert_to_reg_coord, convert_to_ind, null_polyline - use derived_types, only: eddy + use derived_types, only: eddy, null_ssh_contour use geometry, only: polygon_point_dist_2d use good_contour_m, only: good_contour use inside_4_m, only: inside_4 @@ -65,9 +65,7 @@ contains if (e%radius4 == 1) then ! We cannot look for a maximum speed contour other than out_cont. - e%speed_cont%ssh = e%ssh_extr - e%speed_cont%polyline = null_polyline() - e%speed_cont%area = 0. + e%speed_cont = null_ssh_contour() e%max_speed = speed_outerm ! (We will maybe need this to compute the weight of edges in @@ -97,9 +95,7 @@ contains if (abs(speed_outerm) > abs(e%max_speed)) then ! Abandon the contour coming from max_speed_contour_ssh: - e%speed_cont%ssh = e%out_cont%ssh - e%speed_cont%polyline = null_polyline() - e%speed_cont%area = e%out_cont%area + e%speed_cont = null_ssh_contour() e%max_speed = speed_outerm else ! Stick to the contour coming from max_speed_contour_ssh.