diff --git a/F90subroutines/routing_reg.f90 b/F90subroutines/routing_reg.f90 index 6540154cb18838d0f002d235d50c972ac7f74582..4c7b94445b23ff82c23891f4aeff41980e291c4b 100644 --- a/F90subroutines/routing_reg.f90 +++ b/F90subroutines/routing_reg.f90 @@ -2030,7 +2030,6 @@ SUBROUTINE routing_reg_linkup(nbpt, neighbours, nwbas, basin_count, basin_area, DO sp=1,nbpt ! DO sb=1,basin_count(sp) - ! ! ! We only work on this point if it does not flow into the ocean ! or flow to another sub-basin in the same grid box. @@ -2087,6 +2086,7 @@ SUBROUTINE routing_reg_linkup(nbpt, neighbours, nwbas, basin_count, basin_area, ENDIF ! IF ( debug .AND. routing_diagbox_g(sp,diaglalo) ) THEN + IF ( outflow_grid(sp,sb) == 0 ) WRITE(numout,*) "Linkup 1.0 -- Flow out of Halo zone" WRITE(numout,*) "Linkup 1.0 - In routing_reg_linkup working on sp & sb:",sp, sb WRITE(numout,*) "Linkup 1.0 - Coords : ", lalo_g(sp,2), lalo_g(sp,1) WRITE(numout,*) "Linkup 1.0 - outflow_flowdir = ", basin_flowdir(sp,sb) @@ -2388,8 +2388,7 @@ SUBROUTINE routing_reg_linkup(nbpt, neighbours, nwbas, basin_count, basin_area, WRITE(numout,*) "Linkup 4.0 - Tested outflow basin = ", gridbasin(1:nbtotest) WRITE(numout,*) "Linkup 4.0 - outflow_grid =", outflow_grid(sp,sb) WRITE(numout,*) "Linkup 4.0 - outflow_basin = ", outflow_basin(sp,sb) - WRITE(numout,*) "Linkup 4.0 - Number of ocean options : ", nbocean - IF (nbocean > 0 ) WRITE(numout,*) "Linkup 4.0 - ocean direction = ", wocean/nbocean + WRITE(numout,*) "Linkup 4.0 - Number of ocean options : ", nbocean, nbtotest IF ( basin_id(sp,sb) < invented_basins ) THEN WRITE(numout,*) "Linkup 4.0 - Hmin for basin :", hatoutflow(basin_id(sp,sb)) WRITE(numout,*) "Linkup 4.0 - Hmin location :", minhloc(basin_id(sp,sb),1), minhloc(basin_id(sp,sb),2) @@ -2423,12 +2422,17 @@ SUBROUTINE routing_reg_linkup(nbpt, neighbours, nwbas, basin_count, basin_area, ! In this phase we should also consider the size of the basin. If it small then we can ! neglect its and put it into the ocean. ! - IF ( wocean/nbocean < 90.0 .OR. (basin_area(sp,sb)/area_g(sp)*100 < 0.5) ) THEN + IF ( wocean/nbocean < 90.0 .OR. (basin_area(sp,sb)/area_g(sp)*100 < 1.0) ) THEN outflow_grid(sp,sb) = -2 outflow_basin(sp,sb) = undef_int solved(sp,4) = solved(sp,4)+1 IF ( debug .AND. routing_diagbox_g(sp,diaglalo) ) THEN - WRITE(numout,*) "Linkup 4.0 - ", sp, sb, "becomes a coastal flow basin." + WRITE(numout,*) "Linkup 4.1 - In routing_reg_linkup working on sp & sb:", sp, sb + WRITE(numout,*) "Linkup 4.1 - basin_id = ", basin_id(sp,sb) + WRITE(numout,*) "Linkup 4.1 - hierarchy = ", basin_hierarchy(sp,sb) + WRITE(numout,*) "Linkup 4.1 - crit =", crit + WRITE(numout,*) "Linkup 4.1 - ocean direction = ", wocean/nbocean + WRITE(numout,*) "Linkup 4.1 - other criteria : ", basin_area(sp,sb)/area_g(sp)*100 ENDIF ENDIF ENDIF @@ -2441,12 +2445,12 @@ SUBROUTINE routing_reg_linkup(nbpt, neighbours, nwbas, basin_count, basin_area, ! ! These ocean points should not be too far away from the large scale direction. ! - IF ( wocean/nbocean < 90.0 .OR. (basin_area(sp,sb)/area_g(sp)*100 < 0.5) ) THEN + IF ( wocean/nbocean < 180.0 .OR. (basin_area(sp,sb)/area_g(sp)*100 < 25.0) ) THEN outflow_grid(sp,sb) = -2 outflow_basin(sp,sb) = undef_int solved(sp,4) = solved(sp,4)+1 IF ( debug .AND. routing_diagbox_g(sp,diaglalo) ) THEN - WRITE(numout,*) "Linkup 4.0 - ", sp, sb, "becomes a coastal flow basin. Relaxed condition" + WRITE(numout,*) "Linkup 4.1 - ", sp, sb, "becomes a coastal flow basin. Relaxed condition" ENDIF ENDIF ENDIF @@ -2463,6 +2467,12 @@ SUBROUTINE routing_reg_linkup(nbpt, neighbours, nwbas, basin_count, basin_area, ! We probably have not yet solved all points. So we go through all points and basins again ! to see if we cannot find some local solution as a last resort. ! + IF ( debug .AND. routing_diagbox_g(sp,diaglalo) ) THEN + WRITE(numout,*) "Linkup 5.0 - In routing_reg_linkup working on sp & sb:", sp, sb + WRITE(numout,*) "Linkup 5.0 - outflow_basin :", outflow_basin(sp,sb) + WRITE(numout,*) "Linkup 5.0 - outflow_grid :", outflow_grid(sp,sb) + WRITE(numout,*) "Linkup 5.0 - basin_flowdir :", basin_flowdir(sp,sb) + ENDIF ! DO sp=1,nbpt ! @@ -2646,7 +2656,7 @@ SUBROUTINE routing_reg_linkup(nbpt, neighbours, nwbas, basin_count, basin_area, ! inp = outflow_grid(sp,sb) sbl = outflow_basin(sp,sb) - IF ( inp .GE. 0 ) THEN + IF ( inp .GT. 0 ) THEN IF ( basin_count(inp) .LT. sbl ) THEN WRITE(numout,*) 'Point :', sp, ' Basin :', sb WRITE(numout,*) 'Flows into point :', inp, ' basin :', sbl @@ -3367,12 +3377,14 @@ SUBROUTINE routing_reg_truncate(nbpt, nbasmax, gridarea, contfrac, nwbas, num_la DO ij=1,basin_count(ib) ibf = route_togrid_glo(ib,ij) ijf = route_tobasin_glo(ib,ij) - IF ( ijf .GT. basin_count(ibf) .AND. ijf .LE. nbasmax) THEN - WRITE(numout,*) 'Second check' - WRITE(numout,*) 'point :', ib, ' basin :', ij - WRITE(numout,*) 'Flows into point :', ibf, ' basin :', ijf - WRITE(numout,*) 'But it flows into now here as basin count = ', basin_count(ibf) - CALL ipslerr_p(3,'routing_reg_truncate','Problem with routing..','','') + IF ( ibf .GT. 0 ) THEN + IF ( ijf .GT. basin_count(ibf) .AND. ijf .LE. nbasmax) THEN + WRITE(numout,*) 'Second check' + WRITE(numout,*) 'point :', ib, ' basin :', ij + WRITE(numout,*) 'Flows into point :', ibf, ' basin :', ijf + WRITE(numout,*) 'But it flows into now here as basin count = ', basin_count(ibf) + CALL ipslerr_p(3,'routing_reg_truncate','Problem with routing..','','') + ENDIF ENDIF ENDDO ENDDO diff --git a/ModelGrid.py b/ModelGrid.py index a253481756013228f478c7e5f6274ff910a3c489..e525ea6d527d5670a27dd5382c4025a267898278 100644 --- a/ModelGrid.py +++ b/ModelGrid.py @@ -35,7 +35,7 @@ def mindist(coord,lon,lat) : # # Function to gather all land points but while keeping also the neighbour information. # -def gatherland(lon,lat,land,indP,indFi,indFj) : +def gatherland(lon, lat, land, indP, indFi, indFj) : nj,ni=lon.shape coord=[] indF_land=[] @@ -55,6 +55,12 @@ def gatherland(lon,lat,land,indP,indFi,indFj) : for j in range(nj) : if (land[j,i] > 0 ) : ntmp=[] + # + # Indices of neighbouring points are in C and thus +1 will be performed + # For FORTRAN. + # -1 will become 0 and indicate point is outside of domain. + # -2 will become -1 and indicate ocean. + # for r in rose : nnj=j+r[0] nni=i+r[1] @@ -64,7 +70,7 @@ def gatherland(lon,lat,land,indP,indFi,indFj) : else : ntmp.append(-2) else : - ntmp.append(-2) + ntmp.append(-1) neighbours.append(ntmp) return nbland, coord,neighbours,indP_land,indF_land @@ -256,7 +262,8 @@ class ModelGrid : # Gather all land points # self.nbland, self.coordll,self.neighbours,self.indP,indF = gatherland(self.lon_full,self.lat_full,self.land,ind,\ - np.reshape(indFi[:],self.lon_full.shape),np.reshape(indFj[:],self.lon_full.shape)) + np.reshape(indFi[:],self.lon_full.shape),\ + np.reshape(indFj[:],self.lon_full.shape)) INFO("Shape of region :"+str(ni)+" x "+str(nj)+" with nbland="+str(self.nbland)) if self.nbland < 1 or self.nbland > self.nj*self.ni : INFO("Found impossible number of land points : "+str(self.nbland))