LCOV - code coverage report
Current view: top level - dynamics/se/dycore - spacecurve_mod.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 406 640 63.4 %
Date: 2024-12-17 17:57:11 Functions: 11 15 73.3 %

          Line data    Source code
       1             : module spacecurve_mod
       2             :   use cam_logfile, only: iulog
       3             : 
       4             :   implicit none
       5             :   private
       6             : 
       7             :   type, public :: factor_t
       8             :      integer                       :: numfact
       9             :      integer, dimension(:),pointer :: factors => NULL()
      10             :   end type factor_t
      11             : 
      12             : 
      13             :   integer,public, dimension(:,:), allocatable :: ordered
      14             :   integer,public, dimension(:,:), allocatable :: dir     ! direction to move along each level
      15             :   integer,public, dimension(:)  , allocatable :: pos     ! position along each of the axes
      16             : 
      17             :   integer,public                              :: maxdim  ! dimensionality of entire space
      18             :   integer,public                              :: vcnt   ! visitation count
      19             :   logical,private                             :: verbose=.FALSE.
      20             : 
      21             :   type (factor_t),  public                      :: fact
      22             : 
      23             :   SAVE:: fact
      24             :   public :: map
      25             :   public :: hilbert_old
      26             :   public :: PeanoM,hilbert, Cinco
      27             :   public :: GenCurve
      28             :   public :: GenSpaceCurve
      29             :   public :: log2,Factor
      30             :   public :: PrintCurve
      31             :   public :: IsFactorable,IsLoadBalanced
      32             :   public :: genspacepart
      33             : contains
      34             :   !---------------------------------------------------------
      35        1536 :   recursive function Cinco(l,type,ma,md,ja,jd) result(ierr)
      36             : 
      37             :     implicit none
      38             :     integer,intent(in) ::   l,type,ma,md,ja,jd
      39             : 
      40             :     integer ::  lma,lmd,lja,ljd,ltype
      41             :     integer :: ll
      42             :     integer :: ierr
      43             :     logical     :: debug = .FALSE.
      44             : 
      45        1536 :     ll = l
      46        1536 :     if(ll .gt. 1) ltype = fact%factors(ll-1)  ! Set the next type of space curve
      47             : 
      48             :     !--------------------------------------------------------------
      49             :     !  Position [0,0]
      50             :     !--------------------------------------------------------------
      51        1536 :     lma       = ma
      52        1536 :     lmd       = md
      53        1536 :     lja       = lma
      54        1536 :     ljd       = lmd
      55             : 
      56        1536 :     if(ll .gt. 1) then
      57        1536 :        if(debug) write(iulog,21) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
      58        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
      59        1536 :        if(debug) call PrintCurve(ordered)
      60             :     else
      61           0 :        ierr = IncrementCurve(lja,ljd)
      62           0 :        if(debug) write(iulog,*)'Cinco: After Position [0,0] ',pos
      63             :     endif
      64             : 
      65             :     !--------------------------------------------------------------
      66             :     !  Position [1,0]
      67             :     !--------------------------------------------------------------
      68        1536 :     lma       = ma
      69        1536 :     lmd       = md
      70        1536 :     lja       = lma
      71        1536 :     ljd       = lmd
      72             : 
      73        1536 :     if(ll .gt. 1) then
      74        1536 :        if(debug) write(iulog,22) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
      75        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
      76        1536 :        if(debug) call PrintCurve(ordered)
      77             :     else
      78           0 :        ierr = IncrementCurve(lja,ljd)
      79           0 :        if(debug) write(iulog,*)'After Position [1,0] ',pos
      80             :     endif
      81             : 
      82             :     !--------------------------------------------------------------
      83             :     !  Position [2,0]
      84             :     !--------------------------------------------------------------
      85        1536 :     lma       = MOD(ma+1,maxdim)
      86        1536 :     lmd       = md
      87        1536 :     lja       = lma
      88        1536 :     ljd       = lmd
      89             : 
      90        1536 :     if(ll .gt. 1) then
      91        1536 :        if(debug) write(iulog,23) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
      92        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
      93        1536 :        if(debug) call PrintCurve(ordered)
      94             :     else
      95           0 :        ierr = IncrementCurve(lja,ljd)
      96           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
      97             :     endif
      98             : 
      99             :     !--------------------------------------------------------------
     100             :     !  Position [2,1]
     101             :     !--------------------------------------------------------------
     102        1536 :     lma       = MOD(ma+1,maxdim)
     103        1536 :     lmd       = md
     104        1536 :     lja       = lma
     105        1536 :     ljd       = lmd
     106             : 
     107        1536 :     if(ll .gt. 1) then
     108        1536 :        if(debug) write(iulog,24) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     109        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     110        1536 :        if(debug) call PrintCurve(ordered)
     111             :     else
     112           0 :        ierr = IncrementCurve(lja,ljd)
     113           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     114             :     endif
     115             : 
     116             :     !--------------------------------------------------------------
     117             :     !  Position [2,2]
     118             :     !--------------------------------------------------------------
     119        1536 :     lma       = MOD(ma+1,maxdim)
     120        1536 :     lmd       = md
     121        1536 :     lja       = ma
     122        1536 :     ljd       = -md
     123             : 
     124        1536 :     if(ll .gt. 1) then
     125        1536 :        if(debug) write(iulog,25) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     126        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     127        1536 :        if(debug) call PrintCurve(ordered)
     128             :     else
     129           0 :        ierr = IncrementCurve(lja,ljd)
     130           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     131             :     endif
     132             : 
     133             : 
     134             :     !--------------------------------------------------------------
     135             :     !  Position [1,2]
     136             :     !--------------------------------------------------------------
     137        1536 :     lma       = MOD(ma+1,maxdim)
     138        1536 :     lmd       = -md
     139        1536 :     lja       = lma
     140        1536 :     ljd       = lmd
     141             : 
     142        1536 :     if(ll .gt. 1) then
     143        1536 :        if(debug) write(iulog,26) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     144        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     145        1536 :        if(debug) call PrintCurve(ordered)
     146             :     else
     147           0 :        ierr = IncrementCurve(lja,ljd)
     148           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     149             :     endif
     150             : 
     151             :     !--------------------------------------------------------------
     152             :     !  Position [1,1]
     153             :     !--------------------------------------------------------------
     154        1536 :     lma       = ma
     155        1536 :     lmd       = -md
     156        1536 :     lja       = lma
     157        1536 :     ljd       = lmd
     158             : 
     159        1536 :     if(ll .gt. 1) then
     160        1536 :        if(debug) write(iulog,27) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     161        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     162        1536 :        if(debug) call PrintCurve(ordered)
     163             :     else
     164           0 :        ierr = IncrementCurve(lja,ljd)
     165           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     166             :     endif
     167             :     !--------------------------------------------------------------
     168             :     !  Position [0,1]
     169             :     !--------------------------------------------------------------
     170        1536 :     lma       = ma
     171        1536 :     lmd       = -md
     172        1536 :     lja       = MOD(ma+1,maxdim)
     173        1536 :     ljd       = md
     174             : 
     175        1536 :     if(ll .gt. 1) then
     176        1536 :        if(debug) write(iulog,28) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     177        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     178        1536 :        if(debug) call PrintCurve(ordered)
     179             :     else
     180           0 :        ierr = IncrementCurve(lja,ljd)
     181           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     182             :     endif
     183             : 
     184             :     !--------------------------------------------------------------
     185             :     !  Position [0,2]
     186             :     !--------------------------------------------------------------
     187        1536 :     lma       = MOD(ma+1,maxdim)
     188        1536 :     lmd       = md
     189        1536 :     lja       = lma
     190        1536 :     ljd       = lmd
     191             : 
     192        1536 :     if(ll .gt. 1) then
     193        1536 :        if(debug) write(iulog,29) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     194        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     195        1536 :        if(debug) call PrintCurve(ordered)
     196             :     else
     197           0 :        ierr = IncrementCurve(lja,ljd)
     198           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     199             :     endif
     200             : 
     201             :     !--------------------------------------------------------------
     202             :     !  Position [0,3]
     203             :     !--------------------------------------------------------------
     204        1536 :     lma       = MOD(ma+1,maxdim)
     205        1536 :     lmd       = md
     206        1536 :     lja       = lma
     207        1536 :     ljd       = lmd
     208             : 
     209        1536 :     if(ll .gt. 1) then
     210        1536 :        if(debug) write(iulog,30) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     211        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     212        1536 :        if(debug) call PrintCurve(ordered)
     213             :     else
     214           0 :        ierr = IncrementCurve(lja,ljd)
     215           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     216             :     endif
     217             : 
     218             :     !--------------------------------------------------------------
     219             :     !  Position [0,4]
     220             :     !--------------------------------------------------------------
     221        1536 :     lma       = ma
     222        1536 :     lmd       = md
     223        1536 :     lja       = lma
     224        1536 :     ljd       = lmd
     225             : 
     226        1536 :     if(ll .gt. 1) then
     227        1536 :        if(debug) write(iulog,31) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     228        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     229        1536 :        if(debug) call PrintCurve(ordered)
     230             :     else
     231           0 :        ierr = IncrementCurve(lja,ljd)
     232           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     233             :     endif
     234             : 
     235             :     !--------------------------------------------------------------
     236             :     !  Position [1,4]
     237             :     !--------------------------------------------------------------
     238        1536 :     lma       = ma
     239        1536 :     lmd       = md
     240        1536 :     lja       = MOD(ma+1,maxdim)
     241        1536 :     ljd       = -md
     242             : 
     243        1536 :     if(ll .gt. 1) then
     244        1536 :        if(debug) write(iulog,32) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     245        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     246        1536 :        if(debug) call PrintCurve(ordered)
     247             :     else
     248           0 :        ierr = IncrementCurve(lja,ljd)
     249           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     250             :     endif
     251             : 
     252             :     !--------------------------------------------------------------
     253             :     !  Position [1,3]
     254             :     !--------------------------------------------------------------
     255        1536 :     lma       = MOD(ma+1,maxdim)
     256        1536 :     lmd       = -md
     257        1536 :     lja       = ma
     258        1536 :     ljd       = md
     259             : 
     260        1536 :     if(ll .gt. 1) then
     261        1536 :        if(debug) write(iulog,33) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     262        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     263        1536 :        if(debug) call PrintCurve(ordered)
     264             :     else
     265           0 :        ierr = IncrementCurve(lja,ljd)
     266           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     267             :     endif
     268             : 
     269             :     !--------------------------------------------------------------
     270             :     !  Position [2,3]
     271             :     !--------------------------------------------------------------
     272        1536 :     lma       = MOD(ma+1,maxdim)
     273        1536 :     lmd       = md
     274        1536 :     lja       = lma
     275        1536 :     ljd       = lmd
     276             : 
     277        1536 :     if(ll .gt. 1) then
     278        1536 :        if(debug) write(iulog,34) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     279        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     280        1536 :        if(debug) call PrintCurve(ordered)
     281             :     else
     282           0 :        ierr = IncrementCurve(lja,ljd)
     283           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     284             :     endif
     285             : 
     286             :     !--------------------------------------------------------------
     287             :     !  Position [2,4]
     288             :     !--------------------------------------------------------------
     289        1536 :     lma       = ma
     290        1536 :     lmd       = md
     291        1536 :     lja       = lma
     292        1536 :     ljd       = lmd
     293             : 
     294        1536 :     if(ll .gt. 1) then
     295        1536 :        if(debug) write(iulog,35) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     296        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     297        1536 :        if(debug) call PrintCurve(ordered)
     298             :     else
     299           0 :        ierr = IncrementCurve(lja,ljd)
     300           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     301             :     endif
     302             : 
     303             :     !--------------------------------------------------------------
     304             :     !  Position [3,4]
     305             :     !--------------------------------------------------------------
     306        1536 :     lma       = ma
     307        1536 :     lmd       = md
     308        1536 :     lja       = lma
     309        1536 :     ljd       = lmd
     310             : 
     311        1536 :     if(ll .gt. 1) then
     312        1536 :        if(debug) write(iulog,36) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     313        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     314        1536 :        if(debug) call PrintCurve(ordered)
     315             :     else
     316           0 :        ierr = IncrementCurve(lja,ljd)
     317           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     318             :     endif
     319             : 
     320             :     !--------------------------------------------------------------
     321             :     !  Position [4,4]
     322             :     !--------------------------------------------------------------
     323        1536 :     lma       = ma
     324        1536 :     lmd       = md
     325        1536 :     lja       = MOD(ma+1,maxdim)
     326        1536 :     ljd       = -md
     327             : 
     328        1536 :     if(ll .gt. 1) then
     329        1536 :        if(debug) write(iulog,37) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     330        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     331        1536 :        if(debug) call PrintCurve(ordered)
     332             :     else
     333           0 :        ierr = IncrementCurve(lja,ljd)
     334           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     335             :     endif
     336             : 
     337             :     !--------------------------------------------------------------
     338             :     !  Position [4,3]
     339             :     !--------------------------------------------------------------
     340        1536 :     lma       = ma
     341        1536 :     lmd       = -md
     342        1536 :     lja       = lma
     343        1536 :     ljd       = lmd
     344             : 
     345        1536 :     if(ll .gt. 1) then
     346        1536 :        if(debug) write(iulog,38) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     347        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     348        1536 :        if(debug) call PrintCurve(ordered)
     349             :     else
     350           0 :        ierr = IncrementCurve(lja,ljd)
     351           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     352             :     endif
     353             : 
     354             :     !--------------------------------------------------------------
     355             :     !  Position [3,3]
     356             :     !--------------------------------------------------------------
     357        1536 :     lma       = MOD(ma+1,maxdim)
     358        1536 :     lmd       = -md
     359        1536 :     lja       = lma
     360        1536 :     ljd       = lmd
     361             : 
     362        1536 :     if(ll .gt. 1) then
     363        1536 :        if(debug) write(iulog,39) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     364        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     365        1536 :        if(debug) call PrintCurve(ordered)
     366             :     else
     367           0 :        ierr = IncrementCurve(lja,ljd)
     368           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     369             :     endif
     370             : 
     371             :     !--------------------------------------------------------------
     372             :     !  Position [3,2]
     373             :     !--------------------------------------------------------------
     374        1536 :     lma       = MOD(ma+1,maxdim)
     375        1536 :     lmd       = -md
     376        1536 :     lja       = ma
     377        1536 :     ljd       = md
     378             : 
     379        1536 :     if(ll .gt. 1) then
     380        1536 :        if(debug) write(iulog,40) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     381        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     382        1536 :        if(debug) call PrintCurve(ordered)
     383             :     else
     384           0 :        ierr = IncrementCurve(lja,ljd)
     385           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     386             :     endif
     387             : 
     388             :     !--------------------------------------------------------------
     389             :     !  Position [4,2]
     390             :     !--------------------------------------------------------------
     391        1536 :     lma       = ma
     392        1536 :     lmd       = md
     393        1536 :     lja       = MOD(ma+1,maxdim)
     394        1536 :     ljd       = -md
     395             : 
     396        1536 :     if(ll .gt. 1) then
     397        1536 :        if(debug) write(iulog,41) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     398        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     399        1536 :        if(debug) call PrintCurve(ordered)
     400             :     else
     401           0 :        ierr = IncrementCurve(lja,ljd)
     402           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     403             :     endif
     404             : 
     405             :     !--------------------------------------------------------------
     406             :     !  Position [4,1]
     407             :     !--------------------------------------------------------------
     408        1536 :     lma       = ma
     409        1536 :     lmd       = -md
     410        1536 :     lja       = lma
     411        1536 :     ljd       = lmd
     412             : 
     413        1536 :     if(ll .gt. 1) then
     414        1536 :        if(debug) write(iulog,42) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     415        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     416        1536 :        if(debug) call PrintCurve(ordered)
     417             :     else
     418           0 :        ierr = IncrementCurve(lja,ljd)
     419           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     420             :     endif
     421             : 
     422             :     !--------------------------------------------------------------
     423             :     !  Position [3,1]
     424             :     !--------------------------------------------------------------
     425        1536 :     lma       = MOD(ma+1,maxdim)
     426        1536 :     lmd       = -md
     427        1536 :     lja       = lma
     428        1536 :     ljd       = lmd
     429             : 
     430        1536 :     if(ll .gt. 1) then
     431        1536 :        if(debug) write(iulog,43) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     432        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     433        1536 :        if(debug) call PrintCurve(ordered)
     434             :     else
     435           0 :        ierr = IncrementCurve(lja,ljd)
     436           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     437             :     endif
     438             : 
     439             :     !--------------------------------------------------------------
     440             :     !  Position [3,0]
     441             :     !--------------------------------------------------------------
     442        1536 :     lma       = MOD(ma+1,maxdim)
     443        1536 :     lmd       = -md
     444        1536 :     lja       = ma
     445        1536 :     ljd       = md
     446             : 
     447        1536 :     if(ll .gt. 1) then
     448        1536 :        if(debug) write(iulog,44) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     449        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     450        1536 :        if(debug) call PrintCurve(ordered)
     451             :     else
     452           0 :        ierr = IncrementCurve(lja,ljd)
     453           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     454             :     endif
     455             : 
     456             :     !--------------------------------------------------------------
     457             :     !  Position [4,0]
     458             :     !--------------------------------------------------------------
     459        1536 :     lma       = ma
     460        1536 :     lmd       = md
     461        1536 :     lja       = ja
     462        1536 :     ljd       = jd
     463             : 
     464        1536 :     if(ll .gt. 1) then
     465        1536 :        if(debug) write(iulog,45) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     466        1536 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     467        1536 :        if(debug) call PrintCurve(ordered)
     468             :     else
     469           0 :        ierr = IncrementCurve(lja,ljd)
     470           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     471             :     endif
     472             : 
     473             : 21  format('Call Cinco Pos [0,0] Level ',i1,' at (',i2,',',i2,')',4(i3))
     474             : 22  format('Call Cinco Pos [1,0] Level ',i1,' at (',i2,',',i2,')',4(i3))
     475             : 23  format('Call Cinco Pos [2,0] Level ',i1,' at (',i2,',',i2,')',4(i3))
     476             : 24  format('Call Cinco Pos [2,1] Level ',i1,' at (',i2,',',i2,')',4(i3))
     477             : 25  format('Call Cinco Pos [2,2] Level ',i1,' at (',i2,',',i2,')',4(i3))
     478             : 26  format('Call Cinco Pos [1,2] Level ',i1,' at (',i2,',',i2,')',4(i3))
     479             : 27  format('Call Cinco Pos [1,1] Level ',i1,' at (',i2,',',i2,')',4(i3))
     480             : 28  format('Call Cinco Pos [0,1] Level ',i1,' at (',i2,',',i2,')',4(i3))
     481             : 29  format('Call Cinco Pos [0,2] Level ',i1,' at (',i2,',',i2,')',4(i3))
     482             : 30  format('Call Cinco Pos [0,3] Level ',i1,' at (',i2,',',i2,')',4(i3))
     483             : 31  format('Call Cinco Pos [0,4] Level ',i1,' at (',i2,',',i2,')',4(i3))
     484             : 32  format('Call Cinco Pos [1,4] Level ',i1,' at (',i2,',',i2,')',4(i3))
     485             : 33  format('Call Cinco Pos [1,3] Level ',i1,' at (',i2,',',i2,')',4(i3))
     486             : 34  format('Call Cinco Pos [2,3] Level ',i1,' at (',i2,',',i2,')',4(i3))
     487             : 35  format('Call Cinco Pos [2,4] Level ',i1,' at (',i2,',',i2,')',4(i3))
     488             : 36  format('Call Cinco Pos [3,4] Level ',i1,' at (',i2,',',i2,')',4(i3))
     489             : 37  format('Call Cinco Pos [4,4] Level ',i1,' at (',i2,',',i2,')',4(i3))
     490             : 38  format('Call Cinco Pos [4,3] Level ',i1,' at (',i2,',',i2,')',4(i3))
     491             : 39  format('Call Cinco Pos [3,3] Level ',i1,' at (',i2,',',i2,')',4(i3))
     492             : 40  format('Call Cinco Pos [3,2] Level ',i1,' at (',i2,',',i2,')',4(i3))
     493             : 41  format('Call Cinco Pos [4,2] Level ',i1,' at (',i2,',',i2,')',4(i3))
     494             : 42  format('Call Cinco Pos [4,1] Level ',i1,' at (',i2,',',i2,')',4(i3))
     495             : 43  format('Call Cinco Pos [3,1] Level ',i1,' at (',i2,',',i2,')',4(i3))
     496             : 44  format('Call Cinco Pos [3,0] Level ',i1,' at (',i2,',',i2,')',4(i3))
     497             : 45  format('Call Cinco Pos [4,0] Level ',i1,' at (',i2,',',i2,')',4(i3))
     498             : 
     499        1536 :   end function Cinco
     500             : 
     501             :   !---------------------------------------------------------
     502       38400 :   recursive function PeanoM(l,type,ma,md,ja,jd) result(ierr)
     503             : 
     504             :     implicit none
     505             :     integer,intent(in) ::   l,type,ma,md,ja,jd
     506             : 
     507             :     integer ::  lma,lmd,lja,ljd,ltype
     508             :     integer :: ll
     509             :     integer :: ierr
     510             :     logical     :: debug = .FALSE.
     511             : 
     512       38400 :     ll = l
     513       38400 :     if(ll .gt. 1) ltype = fact%factors(ll-1)  ! Set the next type of space curve
     514             :     !--------------------------------------------------------------
     515             :     !  Position [0,0]
     516             :     !--------------------------------------------------------------
     517       38400 :     lma       = MOD(ma+1,maxdim)
     518       38400 :     lmd       = md
     519       38400 :     lja       = lma
     520       38400 :     ljd       = lmd
     521             : 
     522       38400 :     if(ll .gt. 1) then
     523       38400 :        if(debug) write(iulog,21) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     524       38400 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     525       38400 :        if(debug) call PrintCurve(ordered)
     526             :     else
     527           0 :        ierr = IncrementCurve(lja,ljd)
     528           0 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     529             :     endif
     530             : 
     531             : 
     532             :     !--------------------------------------------------------------
     533             :     ! Position [0,1]
     534             :     !--------------------------------------------------------------
     535       38400 :     lma       = MOD(ma+1,maxdim)
     536       38400 :     lmd       = md
     537       38400 :     lja       = lma
     538       38400 :     ljd       = lmd
     539       38400 :     if(ll .gt. 1) then
     540       38400 :        if(debug) write(iulog,22) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     541       38400 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     542       38400 :        if(debug) call PrintCurve(ordered)
     543             :     else
     544           0 :        ierr = IncrementCurve(lja,ljd)
     545           0 :        if(debug) write(iulog,*)'After Position [0,1] ',pos
     546             :     endif
     547             : 
     548             :     !--------------------------------------------------------------
     549             :     ! Position [0,2]
     550             :     !--------------------------------------------------------------
     551       38400 :     lma       = ma
     552       38400 :     lmd       = md
     553       38400 :     lja       = lma
     554       38400 :     ljd       = lmd
     555       38400 :     if(ll .gt. 1) then
     556       38400 :        if(debug) write(iulog,23) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     557       38400 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     558       38400 :        if(debug) call PrintCurve(ordered)
     559             :     else
     560           0 :        ierr = IncrementCurve(lja,ljd)
     561           0 :        if(debug) write(iulog,*)'After Position [0,2] ',pos
     562             :     endif
     563             : 
     564             :     !--------------------------------------------------------------
     565             :     ! Position [1,2]
     566             :     !--------------------------------------------------------------
     567       38400 :     lma       = ma
     568       38400 :     lmd       = md
     569       38400 :     lja       = lma
     570       38400 :     ljd       = lmd
     571       38400 :     if(ll .gt. 1) then
     572       38400 :        if(debug) write(iulog,24) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     573       38400 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     574       38400 :        if(debug) call PrintCurve(ordered)
     575             :     else
     576           0 :        ierr = IncrementCurve(lja,ljd)
     577           0 :        if(debug) write(iulog,*)'After Position [1,2] ',pos
     578             :     endif
     579             : 
     580             : 
     581             :     !--------------------------------------------------------------
     582             :     ! Position [2,2]
     583             :     !--------------------------------------------------------------
     584       38400 :     lma        = ma
     585       38400 :     lmd        = md
     586       38400 :     lja        = MOD(lma+1,maxdim)
     587       38400 :     ljd        = -lmd
     588             : 
     589       38400 :     if(ll .gt. 1) then
     590       38400 :        if(debug) write(iulog,25) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     591       38400 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     592       38400 :        if(debug) call PrintCurve(ordered)
     593             :     else
     594           0 :        ierr = IncrementCurve(lja,ljd)
     595           0 :        if(debug) write(iulog,*)'After Position [2,2] ',pos
     596             :     endif
     597             : 
     598             :     !--------------------------------------------------------------
     599             :     ! Position [2,1]
     600             :     !--------------------------------------------------------------
     601       38400 :     lma        = ma
     602       38400 :     lmd        = -md
     603       38400 :     lja        = lma
     604       38400 :     ljd        = lmd
     605             : 
     606       38400 :     if(ll .gt. 1) then
     607       38400 :        if(debug) write(iulog,26) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     608       38400 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     609       38400 :        if(debug) call PrintCurve(ordered)
     610             :     else
     611           0 :        ierr = IncrementCurve(lja,ljd)
     612           0 :        if(debug) write(iulog,*)'After Position [2,1] ',pos
     613             :     endif
     614             : 
     615             :     !--------------------------------------------------------------
     616             :     ! Position [1,1]
     617             :     !--------------------------------------------------------------
     618       38400 :     lma       = MOD(ma+1,maxdim)
     619       38400 :     lmd       = -md
     620       38400 :     lja        = lma
     621       38400 :     ljd        = lmd
     622             : 
     623       38400 :     if(ll .gt. 1) then
     624       38400 :        if(debug) write(iulog,27) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     625       38400 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     626       38400 :        if(debug) call PrintCurve(ordered)
     627             :     else
     628           0 :        ierr = IncrementCurve(lja,ljd)
     629           0 :        if(debug) write(iulog,*)'After Position [1,1] ',pos
     630             :     endif
     631             : 
     632             : 
     633             :     !--------------------------------------------------------------
     634             :     ! Position [1,0]
     635             :     !--------------------------------------------------------------
     636       38400 :     lma        = MOD(ma+1,maxdim)
     637       38400 :     lmd        = -md
     638       38400 :     lja        = MOD(lma+1,maxdim)
     639       38400 :     ljd        = -lmd
     640             : 
     641       38400 :     if(ll .gt. 1) then
     642       38400 :        if(debug) write(iulog,28) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     643       38400 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     644       38400 :        if(debug) call PrintCurve(ordered)
     645             :     else
     646           0 :        ierr = IncrementCurve(lja,ljd)
     647           0 :        if(debug) write(iulog,*)'After Position [1,0] ',pos
     648             :     endif
     649             : 
     650             :     !--------------------------------------------------------------
     651             :     ! Position [2,0]
     652             :     !--------------------------------------------------------------
     653       38400 :     lma        = ma
     654       38400 :     lmd        = md
     655       38400 :     lja        = ja
     656       38400 :     ljd        = jd
     657             : 
     658       38400 :     if(ll .gt. 1) then
     659       38400 :        if(debug) write(iulog,29) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     660       38400 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     661       38400 :        if(debug) call PrintCurve(ordered)
     662             :     else
     663           0 :        ierr = IncrementCurve(lja,ljd)
     664           0 :        if(debug) write(iulog,*)'After Position [2,0] ',pos
     665             :     endif
     666             : 
     667             : 21  format('Call PeanoM Pos [0,0] Level ',i1,' at (',i2,',',i2,')',4(i3))
     668             : 22  format('Call PeanoM Pos [0,1] Level ',i1,' at (',i2,',',i2,')',4(i3))
     669             : 23  format('Call PeanoM Pos [0,2] Level ',i1,' at (',i2,',',i2,')',4(i3))
     670             : 24  format('Call PeanoM Pos [1,2] Level ',i1,' at (',i2,',',i2,')',4(i3))
     671             : 25  format('Call PeanoM Pos [2,2] Level ',i1,' at (',i2,',',i2,')',4(i3))
     672             : 26  format('Call PeanoM Pos [2,1] Level ',i1,' at (',i2,',',i2,')',4(i3))
     673             : 27  format('Call PeanoM Pos [1,1] Level ',i1,' at (',i2,',',i2,')',4(i3))
     674             : 28  format('Call PeanoM Pos [1,0] Level ',i1,' at (',i2,',',i2,')',4(i3))
     675             : 29  format('Call PeanoM Pos [2,0] Level ',i1,' at (',i2,',',i2,')',4(i3))
     676             : 
     677       38400 :   end function PeanoM
     678             :   !---------------------------------------------------------
     679      345600 :   recursive function hilbert(l,type,ma,md,ja,jd) result(ierr)
     680             : 
     681             :     implicit none
     682             :     integer,intent(in) ::   l,type,ma,md,ja,jd
     683             : 
     684             :     integer ::  lma,lmd,lja,ljd,ltype
     685             :     integer :: ll
     686             :     integer :: ierr
     687             :     logical     :: debug = .FALSE.
     688             : 
     689      345600 :     ll = l
     690      345600 :     if(ll .gt. 1) ltype = fact%factors(ll-1)  ! Set the next type of space curve
     691             :     !--------------------------------------------------------------
     692             :     !  Position [0,0]
     693             :     !--------------------------------------------------------------
     694      345600 :     lma       = MOD(ma+1,maxdim)
     695      345600 :     lmd       = md
     696      345600 :     lja       = lma
     697      345600 :     ljd       = lmd
     698             : 
     699      345600 :     if(ll .gt. 1) then
     700           0 :        if(debug) write(iulog,21) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     701           0 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     702           0 :        if(debug) call PrintCurve(ordered)
     703             :     else
     704      345600 :        ierr = IncrementCurve(lja,ljd)
     705      345600 :        if(debug) write(iulog,*)'After Position [0,0] ',pos
     706             :     endif
     707             : 
     708             : 
     709             :     !--------------------------------------------------------------
     710             :     ! Position [0,1]
     711             :     !--------------------------------------------------------------
     712      345600 :     lma       = ma
     713      345600 :     lmd       = md
     714      345600 :     lja       = lma
     715      345600 :     ljd       = lmd
     716      345600 :     if(ll .gt. 1) then
     717           0 :        if(debug) write(iulog,22) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     718           0 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     719           0 :        if(debug) call PrintCurve(ordered)
     720             :     else
     721      345600 :        ierr = IncrementCurve(lja,ljd)
     722      345600 :        if(debug) write(iulog,*)'After Position [0,1] ',pos
     723             :     endif
     724             : 
     725             : 
     726             :     !--------------------------------------------------------------
     727             :     ! Position [1,1]
     728             :     !--------------------------------------------------------------
     729      345600 :     lma        = ma
     730      345600 :     lmd        = md
     731      345600 :     lja        = MOD(ma+1,maxdim)
     732      345600 :     ljd        = -md
     733             : 
     734      345600 :     if(ll .gt. 1) then
     735           0 :        if(debug) write(iulog,23) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     736           0 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     737           0 :        if(debug) call PrintCurve(ordered)
     738             :     else
     739      345600 :        ierr = IncrementCurve(lja,ljd)
     740      345600 :        if(debug) write(iulog,*)'After Position [1,1] ',pos
     741             :     endif
     742             : 
     743             :     !--------------------------------------------------------------
     744             :     ! Position [1,0]
     745             :     !--------------------------------------------------------------
     746      345600 :     lma        = MOD(ma+1,maxdim)
     747      345600 :     lmd        = -md
     748      345600 :     lja        = ja
     749      345600 :     ljd        = jd
     750             : 
     751      345600 :     if(ll .gt. 1) then
     752           0 :        if(debug) write(iulog,24) ll-1,pos(0),pos(1),lma,lmd,lja,ljd
     753           0 :        ierr  = GenCurve(ll-1,ltype,lma,lmd,lja,ljd)
     754           0 :        if(debug) call PrintCurve(ordered)
     755             :     else
     756      345600 :        ierr = IncrementCurve(lja,ljd)
     757      345600 :        if(debug) write(iulog,*)'After Position [1,0] ',pos
     758             :     endif
     759             : 
     760             : 21  format('Call Hilbert Pos [0,0] Level ',i1,' at (',i2,',',i2,')',4(i3))
     761             : 22  format('Call Hilbert Pos [0,1] Level ',i1,' at (',i2,',',i2,')',4(i3))
     762             : 23  format('Call Hilbert Pos [1,1] Level ',i1,' at (',i2,',',i2,')',4(i3))
     763             : 24  format('Call Hilbert Pos [1,0] Level ',i1,' at (',i2,',',i2,')',4(i3))
     764             : 
     765      345600 :   end function hilbert
     766             :   !---------------------------------------------------------
     767     1382400 :   function IncrementCurve(ja,jd) result(ierr)
     768             : 
     769             :     implicit none
     770             : 
     771             :     integer    :: ja,jd
     772             :     integer    :: ierr
     773             : 
     774     1382400 :     ordered(pos(0)+1,pos(1)+1) = vcnt
     775     1382400 :     vcnt  = vcnt + 1
     776     1382400 :     pos(ja) = pos(ja) + jd
     777             : 
     778     1382400 :     ierr = 0
     779     1382400 :   end function IncrementCurve
     780             :   !---------------------------------------------------------
     781           0 :   recursive function hilbert_old(l,d,ma,md,ja,jd) result(ierr)
     782             : 
     783             :     integer  :: l,d             ! log base 2 of levels and dimensions left
     784             :     integer  :: ma,md           ! main axis and direction
     785             :     integer  :: ja,jd           ! joiner axis and direction
     786             : 
     787             :     integer  :: ierr
     788             :     integer  :: axis
     789             :     integer  :: ll
     790             : 
     791           0 :     if(verbose) write(iulog,10) l,d,ma,md,ja,jd,pos(0),pos(1)
     792           0 :     ll = l     ! Copy this to a temporary variable
     793           0 :     if(d == 0) then
     794           0 :        ll=ll-1
     795           0 :        if(ll == 0) then
     796             :           return
     797             :        endif
     798           0 :        axis = ja
     799           0 :        if(dir(ll,axis) /= jd) then     ! do not move away from joiner plane
     800           0 :           axis = MOD(axis+1,maxdim)    ! next axis
     801             :        endif
     802           0 :        if(verbose) write(iulog,*)'hilbert_old: call hilbert_old(l,d) #1:'
     803           0 :        ierr = hilbert_old(ll,maxdim,axis,dir(ll,axis),ja,jd)
     804           0 :        dir(ll,ja) = -dir(ll,ja)
     805           0 :        return
     806             :     endif
     807           0 :     axis = MOD(ma+1,maxdim)
     808           0 :     if(verbose) write(iulog,*)'hilbert_old: before call hilbert_old(l,d) #2:'
     809           0 :     ierr = hilbert_old(ll,d-1,axis,dir(ll,axis),ma,md)
     810           0 :     if(verbose) write(iulog,*)'hilbert_old:  after call hilbert_old(l,d) #2:'
     811           0 :     if(verbose) write(iulog,30) l,d,ma,md,ja,jd,pos(0),pos(1)
     812             : 
     813             : 
     814           0 :     pos(ma) = pos(ma) + md
     815           0 :     dir(ll,ma) = - dir(ll,ma)
     816             : 
     817             :     !----------------------------------
     818             :     !  Mark this node as visited
     819             :     !----------------------------------
     820           0 :     if(verbose) write(iulog,20) l,d,ma,md,ja,jd,pos(0),pos(1)
     821           0 :     vcnt=vcnt+1
     822           0 :     if(verbose) write(iulog,15) pos(0)+1,pos(1)+1,vcnt
     823           0 :     if(verbose) write(iulog,*)'  '
     824           0 :     if(verbose) write(iulog,*)'  '
     825           0 :     ordered(pos(0)+1,pos(1)+1)=vcnt
     826             : 
     827           0 :     if(verbose) write(iulog,*)'hilbert_old: before call hilbert_old(l,d) #3:'
     828           0 :     ierr = hilbert_old(ll,d-1,axis,dir(ll,axis),ja,jd)
     829           0 :     if(verbose) write(iulog,*)'hilbert_old:  after call hilbert_old(l,d) #3:'
     830             : 
     831             : 10  format('hilbert_old: Entering hilbert_old (l,d,ma,md,ja,jd) are: ', &
     832             :          2(i4),'  [',2(i3),'][',2(i3),']',2(i3))
     833             : 15  format('hilbert_old: mark element {x,y,ordered}:',3(i4))
     834             : 20  format('hilbert_old: Before visit code (l,d,ma,md,ja,jd) are:', &
     835             :          2(i4),'  [',2(i3),'][',2(i3),']',2(i3))
     836             : 
     837             : 30  format('hilbert_old:  after call hilbert_old(l,d) #2: (l,d,ma,md,ja,jd are:', &
     838             :          2(i4),'  [',2(i3),'][',2(i3),']',2(i3))
     839             : 
     840             :   end function hilbert_old
     841             :   !---------------------------------------------------------
     842        3072 :   function log2( n)
     843             : 
     844             :     implicit none
     845             : 
     846             :     integer  :: n
     847             : 
     848             :     integer  :: log2,tmp
     849             :     !
     850             :     !  Find the log2 of input value
     851             :     !
     852        3072 :     log2 = 1
     853        3072 :     tmp =n
     854       12288 :     do while (tmp/2 .ne. 1)
     855        9216 :        tmp=tmp/2
     856        9216 :        log2=log2+1
     857             :     enddo
     858             : 
     859        3072 :   end function log2
     860             :   !---------------------------------------------------------
     861           0 :   function  IsLoadBalanced(nelem,npart)
     862             : 
     863             :     implicit none
     864             : 
     865             :     integer        :: nelem,npart
     866             : 
     867             :     logical        :: IsLoadBalanced
     868             : 
     869             :     integer        :: tmp1
     870             : 
     871           0 :     tmp1 = nelem/npart
     872             : 
     873           0 :     if(npart*tmp1 == nelem ) then
     874             :        IsLoadBalanced=.TRUE.
     875             :     else
     876           0 :        IsLoadBalanced=.FALSE.
     877             :     endif
     878             : 
     879           0 :   end function IsLoadBalanced
     880             :   !---------------------------------------------------------
     881      385536 :   recursive function GenCurve(l,type,ma,md,ja,jd) result(ierr)
     882             : 
     883             :     implicit none
     884             :     integer,intent(in)               :: l,type,ma,md,ja,jd
     885             :     integer                          :: ierr
     886             : 
     887      385536 :     if(type == 2) then
     888      345600 :        ierr = hilbert(l,type,ma,md,ja,jd)
     889       39936 :     elseif ( type == 3) then
     890       38400 :        ierr = PeanoM(l,type,ma,md,ja,jd)
     891        1536 :     elseif ( type == 5) then
     892        1536 :        ierr = Cinco(l,type,ma,md,ja,jd)
     893             :     endif
     894             : 
     895      385536 :   end function GenCurve
     896             :   !---------------------------------------------------------
     897        3072 :   function Factor(num) result(res)
     898             : 
     899             :     implicit none
     900             :     integer,intent(in)  :: num
     901             : 
     902             :     type (factor_t)     :: res
     903             :     integer             :: tmp,tmp2,tmp3,tmp5
     904             :     integer             :: i,n
     905             :     logical             :: found
     906             : 
     907             :     ! --------------------------------------
     908             :     ! Allocate for max # of factors
     909             :     ! --------------------------------------
     910        3072 :     tmp = num
     911        3072 :     tmp2 = log2(num)
     912        9216 :     allocate(res%factors(tmp2))
     913             : 
     914        3072 :     n=0
     915             :     !-----------------------
     916             :     !  Look for factors of 2
     917             :     !-----------------------
     918        3072 :     found=.TRUE.
     919        9216 :     do while (found)
     920        6144 :        found = .FALSE.
     921        6144 :        tmp2 = tmp/2
     922        9216 :        if( tmp2*2 == tmp ) then
     923        3072 :           n = n + 1
     924        3072 :           res%factors(n) = 2
     925        3072 :           found = .TRUE.
     926        3072 :           tmp = tmp2
     927             :        endif
     928             :     enddo
     929             : 
     930             :     !-----------------------
     931             :     !  Look for factors of 3
     932             :     !-----------------------
     933             :     found=.TRUE.
     934        9216 :     do while (found)
     935        6144 :        found = .FALSE.
     936        6144 :        tmp3 = tmp/3
     937        9216 :        if( tmp3*3 == tmp ) then
     938        3072 :           n = n + 1
     939        3072 :           res%factors(n) = 3
     940        3072 :           found = .TRUE.
     941        3072 :           tmp = tmp3
     942             :        endif
     943             :     enddo
     944             : 
     945             :     !-----------------------
     946             :     !  Look for factors of 5
     947             :     !-----------------------
     948             :     found=.TRUE.
     949        9216 :     do while (found)
     950        6144 :        found = .FALSE.
     951        6144 :        tmp5 = tmp/5
     952        9216 :        if( tmp5*5 == tmp ) then
     953        3072 :           n = n + 1
     954        3072 :           res%factors(n) = 5
     955        3072 :           found = .TRUE.
     956        3072 :           tmp = tmp5
     957             :        endif
     958             :     enddo
     959             : 
     960             :     tmp=1
     961       12288 :     do i=1,n
     962       12288 :        tmp = tmp * res%factors(i)
     963             :     enddo
     964        3072 :     if(tmp == num) then
     965        3072 :        res%numfact = n
     966             :     else
     967           0 :        res%numfact = -1
     968             :     endif
     969             : 
     970        3072 :   end function Factor
     971             :   !---------------------------------------------------------
     972             : 
     973        1536 :   function IsFactorable(n)
     974             :     use cam_abortutils, only: endrun
     975             : 
     976             :     integer,intent(in)  :: n
     977             :     type (factor_t)     :: fact
     978             : 
     979             :     logical  :: IsFactorable
     980             : 
     981             :     if (associated(fact%factors)) then
     982             :       call endrun("fact already allocated!!!")
     983             :     end if
     984        1536 :     fact = Factor(n)
     985        1536 :     if(fact%numfact .ne. -1) then
     986             :        IsFactorable = .TRUE.
     987             :     else
     988           0 :        IsFactorable = .FALSE.
     989             :     endif
     990             : 
     991        1536 :   end function IsFactorable
     992             :   !------------------------------------------------
     993             : 
     994        1536 :   subroutine map(l)
     995             : 
     996             :     implicit none
     997             :     integer :: l,d
     998             :     integer :: type, ierr
     999             : 
    1000        1536 :     d = SIZE(pos)
    1001             : 
    1002        4608 :     pos=0
    1003        1536 :     maxdim=d
    1004        1536 :     vcnt=0
    1005             : 
    1006        1536 :     type = fact%factors(l)
    1007        1536 :        ierr = GenCurve(l,type,0,1,0,1)
    1008             : 
    1009        1536 :      end subroutine map
    1010             :      !---------------------------------------------------------
    1011        1536 :      subroutine GenSpaceCurve(Mesh)
    1012             : 
    1013             :        implicit none
    1014             : 
    1015             :        integer,target,intent(inout) :: Mesh(:,:)
    1016             :        integer :: level,dim
    1017             : 
    1018             :        integer :: gridsize
    1019             : 
    1020             :        !  Setup the size of the grid to traverse
    1021             : 
    1022        1536 :        dim = 2
    1023        1536 :        gridsize = SIZE(Mesh,dim=1)
    1024        1536 :        fact     = factor(gridsize)
    1025        1536 :        level    = fact%numfact
    1026             : 
    1027        1536 :        if(verbose) write(iulog,*)'GenSpacecurve: level is ',level
    1028        6144 :        allocate(ordered(gridsize,gridsize))
    1029             : 
    1030             :        ! Setup the working arrays for the traversal
    1031        1536 :        allocate(pos(0:dim-1))
    1032             : 
    1033             :        !  The array ordered will contain the visitation order
    1034     1430016 :        ordered(:,:) = 0
    1035             : 
    1036        1536 :        call map(level)
    1037             : 
    1038     1430016 :        Mesh(:,:) = ordered(:,:)
    1039             : 
    1040        1536 :      end subroutine GenSpaceCurve
    1041             :      !-------------------------------------------------------------------------------------------------------
    1042           0 :      subroutine PrintCurve(Mesh)
    1043             :        implicit none
    1044             :        integer,target ::  Mesh(:,:)
    1045             :        integer :: gridsize,i
    1046             : 
    1047           0 :        gridsize = SIZE(Mesh,dim=1)
    1048             : 
    1049           0 :        if(gridsize == 2) then
    1050           0 :           write (iulog,*) "A Level 1 Hilbert Curve:"
    1051           0 :           write (iulog,*) "------------------------"
    1052           0 :           do i=1,gridsize
    1053           0 :              write(iulog,2) Mesh(1,i),Mesh(2,i)
    1054             :           enddo
    1055             :        else if(gridsize == 3) then
    1056           0 :           write (iulog,*) "A Level 1 Peano Meandering Curve:"
    1057           0 :           write (iulog,*) "---------------------------------"
    1058           0 :           do i=1,gridsize
    1059           0 :              write(iulog,3) Mesh(1,i),Mesh(2,i),Mesh(3,i)
    1060             :           enddo
    1061             :        else if(gridsize == 4) then
    1062           0 :           write (iulog,*) "A Level 2 Hilbert Curve:"
    1063           0 :           write (iulog,*) "------------------------"
    1064           0 :           do i=1,gridsize
    1065           0 :              write(iulog,4) Mesh(1,i),Mesh(2,i),Mesh(3,i),Mesh(4,i)
    1066             :           enddo
    1067             :        else if(gridsize == 5) then
    1068           0 :           write (iulog,*) "A Level 1 Cinco Curve:"
    1069           0 :           write (iulog,*) "------------------------"
    1070           0 :           do i=1,gridsize
    1071           0 :              write(iulog,5) Mesh(1,i),Mesh(2,i),Mesh(3,i),Mesh(4,i),Mesh(5,i)
    1072             :           enddo
    1073             :        else if(gridsize == 6) then
    1074           0 :           write (iulog,*) "A Level 1 Hilbert and Level 1 Peano Curve:"
    1075           0 :           write (iulog,*) "------------------------------------------"
    1076           0 :           do i=1,gridsize
    1077           0 :              write(iulog,6) Mesh(1,i),Mesh(2,i),Mesh(3,i),Mesh(4,i),Mesh(5,i),Mesh(6,i)
    1078             :           enddo
    1079             :        else if(gridsize == 8) then
    1080           0 :           write (iulog,*) "A Level 3 Hilbert Curve:"
    1081           0 :           write (iulog,*) "------------------------"
    1082           0 :           do i=1,gridsize
    1083           0 :              write(iulog,8) Mesh(1,i),Mesh(2,i),Mesh(3,i),Mesh(4,i), &
    1084           0 :                   Mesh(5,i),Mesh(6,i),Mesh(7,i),Mesh(8,i)
    1085             :           enddo
    1086             :        else if(gridsize == 9) then
    1087           0 :           write (iulog,*) "A Level 2 Peano Meandering Curve:"
    1088           0 :           write (iulog,*) "---------------------------------"
    1089           0 :           do i=1,gridsize
    1090           0 :              write(iulog,9) Mesh(1,i),Mesh(2,i),Mesh(3,i),Mesh(4,i), &
    1091           0 :                   Mesh(5,i),Mesh(6,i),Mesh(7,i),Mesh(8,i), &
    1092           0 :                   Mesh(9,i)
    1093             :           enddo
    1094             :        else if(gridsize == 10) then
    1095           0 :           write (iulog,*) "A Level 1 Hilbert and Level 1 Cinco Curve:"
    1096           0 :           write (iulog,*) "---------------------------------"
    1097           0 :           do i=1,gridsize
    1098           0 :              write(iulog,10) Mesh(1,i),Mesh(2,i),Mesh(3,i),Mesh(4,i), &
    1099           0 :                   Mesh(5,i),Mesh(6,i),Mesh(7,i),Mesh(8,i), &
    1100           0 :                   Mesh(9,i),Mesh(10,i)
    1101             :           enddo
    1102             :        else if(gridsize == 12) then
    1103           0 :           write (iulog,*) "A Level 2 Hilbert and Level 1 Peano Curve:"
    1104           0 :           write (iulog,*) "------------------------------------------"
    1105           0 :           do i=1,gridsize
    1106           0 :              write(iulog,12) Mesh(1,i),Mesh(2,i), Mesh(3,i), Mesh(4,i), &
    1107           0 :                   Mesh(5,i),Mesh(6,i), Mesh(7,i), Mesh(8,i), &
    1108           0 :                   Mesh(9,i),Mesh(10,i),Mesh(11,i),Mesh(12,i)
    1109             :           enddo
    1110             :        else if(gridsize == 15) then
    1111           0 :           write (iulog,*) "A Level 1 Peano and Level 1 Cinco Curve:"
    1112           0 :           write (iulog,*) "------------------------"
    1113           0 :           do i=1,gridsize
    1114           0 :              write(iulog,15) Mesh(1,i),Mesh(2,i),Mesh(3,i),Mesh(4,i), &
    1115           0 :                   Mesh(5,i),Mesh(6,i),Mesh(7,i),Mesh(8,i), &
    1116           0 :                   Mesh(9,i),Mesh(10,i),Mesh(11,i),Mesh(12,i), &
    1117           0 :                   Mesh(13,i),Mesh(14,i),Mesh(15,i)
    1118             :           enddo
    1119             :        else if(gridsize == 16) then
    1120           0 :           write (iulog,*) "A Level 4 Hilbert Curve:"
    1121           0 :           write (iulog,*) "------------------------"
    1122           0 :           do i=1,gridsize
    1123           0 :              write(iulog,16) Mesh(1,i),Mesh(2,i),Mesh(3,i),Mesh(4,i), &
    1124           0 :                   Mesh(5,i),Mesh(6,i),Mesh(7,i),Mesh(8,i), &
    1125           0 :                   Mesh(9,i),Mesh(10,i),Mesh(11,i),Mesh(12,i), &
    1126           0 :                   Mesh(13,i),Mesh(14,i),Mesh(15,i),Mesh(16,i)
    1127             :           enddo
    1128             :        else if(gridsize == 18) then
    1129           0 :           write (iulog,*) "A Level 1 Hilbert and Level 2 Peano Curve:"
    1130           0 :           write (iulog,*) "------------------------------------------"
    1131           0 :           do i=1,gridsize
    1132           0 :              write(iulog,18) Mesh(1,i), Mesh(2,i), Mesh(3,i), Mesh(4,i), &
    1133           0 :                   Mesh(5,i), Mesh(6,i), Mesh(7,i), Mesh(8,i), &
    1134           0 :                   Mesh(9,i), Mesh(10,i),Mesh(11,i),Mesh(12,i), &
    1135           0 :                   Mesh(13,i),Mesh(14,i),Mesh(15,i),Mesh(16,i), &
    1136           0 :                   Mesh(17,i),Mesh(18,i)
    1137             :           enddo
    1138             :        else if(gridsize == 20) then
    1139           0 :           write (iulog,*) "A Level 2 Hilbert and Level 1 Cinco Curve:"
    1140           0 :           write (iulog,*) "------------------------------------------"
    1141           0 :           do i=1,gridsize
    1142           0 :              write(iulog,20) Mesh(1,i), Mesh(2,i), Mesh(3,i), Mesh(4,i), &
    1143           0 :                   Mesh(5,i), Mesh(6,i), Mesh(7,i), Mesh(8,i), &
    1144           0 :                   Mesh(9,i), Mesh(10,i),Mesh(11,i),Mesh(12,i), &
    1145           0 :                   Mesh(13,i),Mesh(14,i),Mesh(15,i),Mesh(16,i), &
    1146           0 :                   Mesh(17,i),Mesh(18,i),Mesh(19,i),Mesh(20,i)
    1147             :           enddo
    1148             :        else if(gridsize == 24) then
    1149           0 :           write (iulog,*) "A Level 3 Hilbert and Level 1 Peano Curve:"
    1150           0 :           write (iulog,*) "------------------------------------------"
    1151           0 :           do i=1,gridsize
    1152           0 :              write(iulog,24) Mesh(1,i), Mesh(2,i), Mesh(3,i), Mesh(4,i), &
    1153           0 :                   Mesh(5,i), Mesh(6,i), Mesh(7,i), Mesh(8,i), &
    1154           0 :                   Mesh(9,i), Mesh(10,i),Mesh(11,i),Mesh(12,i), &
    1155           0 :                   Mesh(13,i),Mesh(14,i),Mesh(15,i),Mesh(16,i), &
    1156           0 :                   Mesh(17,i),Mesh(18,i),Mesh(19,i),Mesh(20,i), &
    1157           0 :                   Mesh(21,i),Mesh(22,i),Mesh(23,i),Mesh(24,i)
    1158             :           enddo
    1159             :        else if(gridsize == 25) then
    1160           0 :           write (iulog,*) "A Level 2 Cinco Curve:"
    1161           0 :           write (iulog,*) "------------------------------------------"
    1162           0 :           do i=1,gridsize
    1163           0 :              write(iulog,25) Mesh(1,i), Mesh(2,i), Mesh(3,i), Mesh(4,i), &
    1164           0 :                   Mesh(5,i), Mesh(6,i), Mesh(7,i), Mesh(8,i), &
    1165           0 :                   Mesh(9,i), Mesh(10,i),Mesh(11,i),Mesh(12,i), &
    1166           0 :                   Mesh(13,i),Mesh(14,i),Mesh(15,i),Mesh(16,i), &
    1167           0 :                   Mesh(17,i),Mesh(18,i),Mesh(19,i),Mesh(20,i), &
    1168           0 :                   Mesh(21,i),Mesh(22,i),Mesh(23,i),Mesh(24,i), &
    1169           0 :                   Mesh(25,i)
    1170             :           enddo
    1171             :        else if(gridsize == 27) then
    1172           0 :           write (iulog,*) "A Level 3 Peano Meandering Curve:"
    1173           0 :           write (iulog,*) "---------------------------------"
    1174           0 :           do i=1,gridsize
    1175           0 :              write(iulog,27) Mesh(1,i), Mesh(2,i), Mesh(3,i), Mesh(4,i), &
    1176           0 :                   Mesh(5,i), Mesh(6,i), Mesh(7,i), Mesh(8,i), &
    1177           0 :                   Mesh(9,i), Mesh(10,i),Mesh(11,i),Mesh(12,i), &
    1178           0 :                   Mesh(13,i),Mesh(14,i),Mesh(15,i),Mesh(16,i), &
    1179           0 :                   Mesh(17,i),Mesh(18,i),Mesh(19,i),Mesh(20,i), &
    1180           0 :                   Mesh(21,i),Mesh(22,i),Mesh(23,i),Mesh(24,i), &
    1181           0 :                   Mesh(25,i),Mesh(26,i),Mesh(27,i)
    1182             :           enddo
    1183             :        else if(gridsize == 32) then
    1184           0 :           write (iulog,*) "A Level 5 Hilbert Curve:"
    1185           0 :           write (iulog,*) "------------------------"
    1186           0 :           do i=1,gridsize
    1187           0 :              write(iulog,32) Mesh(1,i), Mesh(2,i), Mesh(3,i), Mesh(4,i),  &
    1188           0 :                   Mesh(5,i), Mesh(6,i), Mesh(7,i), Mesh(8,i),  &
    1189           0 :                   Mesh(9,i), Mesh(10,i),Mesh(11,i),Mesh(12,i), &
    1190           0 :                   Mesh(13,i),Mesh(14,i),Mesh(15,i),Mesh(16,i), &
    1191           0 :                   Mesh(17,i),Mesh(18,i),Mesh(19,i),Mesh(20,i), &
    1192           0 :                   Mesh(21,i),Mesh(22,i),Mesh(23,i),Mesh(24,i), &
    1193           0 :                   Mesh(25,i),Mesh(26,i),Mesh(27,i),Mesh(28,i), &
    1194           0 :                   Mesh(29,i),Mesh(30,i),Mesh(31,i),Mesh(32,i)
    1195             :           enddo
    1196             :        endif
    1197             : 2      format('|',2(i2,'|'))
    1198             : 3      format('|',3(i2,'|'))
    1199             : 4      format('|',4(i2,'|'))
    1200             : 5      format('|',5(i2,'|'))
    1201             : 6      format('|',6(i2,'|'))
    1202             : 8      format('|',8(i2,'|'))
    1203             : 9      format('|',9(i2,'|'))
    1204             : 10     format('|',10(i2,'|'))
    1205             : 12     format('|',12(i3,'|'))
    1206             : 15     format('|',15(i3,'|'))
    1207             : 16     format('|',16(i3,'|'))
    1208             : 18     format('|',18(i3,'|'))
    1209             : 20     format('|',20(i3,'|'))
    1210             : 24     format('|',24(i3,'|'))
    1211             : 25     format('|',25(i3,'|'))
    1212             : 27     format('|',27(i3,'|'))
    1213             : 32     format('|',32(i4,'|'))
    1214             : 
    1215           0 :      end subroutine PrintCurve
    1216             : 
    1217             :      !-------------------------------------------------------------------------------------------------------
    1218        1536 :      subroutine genspacepart(GridVertex)
    1219             :        use dimensions_mod, only: npart
    1220             :        use gridgraph_mod,  only: gridedge_t, gridvertex_t
    1221             : 
    1222             :        type (GridVertex_t), intent(inout) :: GridVertex(:)
    1223             : 
    1224             :        integer               :: nelem, nelemd
    1225             :        integer               :: k, tmp1, id, s1, extra
    1226             : 
    1227        1536 :        nelem      = SIZE(GridVertex(:))
    1228             : 
    1229        1536 :        nelemd = nelem / npart
    1230             :        ! every cpu gets nelemd elements, but the first 'extra' get nelemd+1
    1231        1536 :        extra = mod(nelem,npart)
    1232        1536 :        s1 = extra*(nelemd+1)
    1233             : 
    1234             :        ! split curve into two curves:
    1235             :        ! 1 ... s1  s2 ... nelem
    1236             :        !
    1237             :        !  s1 = extra*(nelemd+1)         (count be 0)
    1238             :        !  s2 = s1+1
    1239             :        !
    1240             :        ! First region gets nelemd+1 elements per Processor
    1241             :        ! Second region gets nelemd elements per Processor
    1242             : 
    1243             :        ! ===========================================
    1244             :        !  Add the partitioning information into the
    1245             :        !    Grid Vertex and Grid Edge structures
    1246             :        ! ===========================================
    1247             : 
    1248     8295936 :        do k = 1, nelem
    1249     8294400 :          id = GridVertex(k)%SpaceCurve
    1250     8295936 :          if (id <= s1) then
    1251      296448 :            tmp1 = id/(nelemd+1)
    1252      296448 :            GridVertex(k)%processor_number = tmp1 + 1
    1253             :          else
    1254     7997952 :            id = id - s1
    1255     7997952 :            tmp1 = id / nelemd
    1256     7997952 :            GridVertex(k)%processor_number = extra + tmp1+1
    1257             :          end if
    1258             :        end do
    1259             : #if 0
    1260             :        if (masterproc) then
    1261             :          write(iulog, *)'Space-Filling Curve Parititioning: '
    1262             :          write(iulog, '(2(a,i0))') 'npart = ',npart,', nelem = ',nelem
    1263             :          write(iulog, '(2(a,i0))') 'nelemd = ',npart,', extra = ',extra
    1264             :          write(iulog, '(a)') ' elem    task#'
    1265             :          do k = 1, nelem
    1266             :            write(iulog,'(i6,"  ",i6)') k, GridVertex(k)%processor_number
    1267             :          end do
    1268             :        end if
    1269             :        call mpi_barrier(mpicom, tmp1)
    1270             : #endif
    1271             : 
    1272        1536 :      end subroutine genspacepart
    1273             : 
    1274           0 :    end module spacecurve_mod

Generated by: LCOV version 1.14