From 8321ad6eaec1787f2bd9773e666040cd5a525882 Mon Sep 17 00:00:00 2001
From: oawile <oawile@7c7fe9aa-52eb-4d9e-b0a8-ba7d787348e9>
Date: Thu, 20 May 2010 21:02:41 +0000
Subject: [PATCH] - updated ODE routines to use the new topology data
 structures (UNTESTED)

git-svn-id: https://ppm.inf.ethz.ch/svn/ppmnumerics/branches/ngtopo/libppmnumerics@626 7c7fe9aa-52eb-4d9e-b0a8-ba7d787348e9
---
 src/ppm_module_data_ode.f   |  5 +++++
 src/ppm_ode_init.f          | 12 +++++++++---
 src/ppm_ode_map_pop.f       |  7 +++----
 src/ppm_ode_map_push.f      |  5 +----
 src/ppm_ode_rhsfunc_macro.h | 16 ++++++++--------
 src/ppm_ode_step.f          | 27 ++++++++++++++++++++-------
 6 files changed, 46 insertions(+), 26 deletions(-)

diff --git a/src/ppm_module_data_ode.f b/src/ppm_module_data_ode.f
index e9bf118..c0ba9a6 100644
--- a/src/ppm_module_data_ode.f
+++ b/src/ppm_module_data_ode.f
@@ -124,6 +124,11 @@
         INTEGER            :: ppm_max_mid
         INTEGER            :: ppm_max_mid_allocd
 
+        !-----------------------------------------------------------------------
+        ! topology ID to work on
+        !-----------------------------------------------------------------------
+        INTEGER            :: ppm_ode_topoid
+
       CONTAINS
         SUBROUTINE ppm_module_data_ode_activate
 
diff --git a/src/ppm_ode_init.f b/src/ppm_ode_init.f
index f06a7f7..4687941 100644
--- a/src/ppm_ode_init.f
+++ b/src/ppm_ode_init.f
@@ -50,7 +50,7 @@
       !  ETH Zentrum, Hirschengraben 84
       !  CH-8092 Zurich, Switzerland
       !-------------------------------------------------------------------------
-      SUBROUTINE ppm_ode_init(info)
+      SUBROUTINE ppm_ode_init(topoid,info)
       !-----------------------------------------------------------------------
       !  Includes
       !-----------------------------------------------------------------------
@@ -67,7 +67,8 @@
         !-----------------------------------------------------------------------
         !  Arguments
         !-----------------------------------------------------------------------
-        INTEGER,                    INTENT(  out) :: info
+        INTEGER,                    INTENT(IN   ) :: topoid
+        INTEGER,                    INTENT(  OUT) :: info
         !-----------------------------------------------------------------------
         ! Local Variables
         !-----------------------------------------------------------------------
@@ -94,7 +95,7 @@
         END IF
         mid = -1
         !-----------------------------------------------------------------------
-        ! nullify some guys
+        ! nullify some module variables
         !-----------------------------------------------------------------------
         NULLIFY(ppm_ode_ischeme);    NULLIFY(ppm_ode_adaptive)
         NULLIFY(ppm_ode_stages);    NULLIFY(ppm_ode_state)
@@ -103,6 +104,11 @@
         NULLIFY(ppm_ode_kscheme)
         ppm_max_mid        = 0
         ppm_max_mid_allocd = 0
+
+        !-----------------------------------------------------------------------
+        ! register the ID of the topology to be used for the ODE solver
+        !-----------------------------------------------------------------------
+        ppm_ode_topoid = topoid
 9999    CONTINUE        
         !-----------------------------------------------------------------------
         ! substop
diff --git a/src/ppm_ode_map_pop.f b/src/ppm_ode_map_pop.f
index 6d9fb4e..0c4e94f 100644
--- a/src/ppm_ode_map_pop.f
+++ b/src/ppm_ode_map_pop.f
@@ -110,7 +110,7 @@
         INTEGER                                   :: ldasend
         INTEGER                                   :: throwaway
         INTEGER                                   :: mid, iopt
-        INTEGER                                   :: to_topo, umidmin, umidmax
+        INTEGER                                   :: umidmin, umidmax
         INTEGER,                    DIMENSION(2)  :: dime
         !-----------------------------------------------------------------------
         !  call substart
@@ -181,12 +181,11 @@
         mid     = ppm_internal_mid(odeid)
         ldasend = lda*ppm_ode_sent(mid)
         IF(ldasend.EQ.0) GOTO 9999
-        to_topo = -1
+
         !-----------------------------------------------------------------------
         ! get the stuff
         !-----------------------------------------------------------------------
-        CALL ppm_map_part(bfr,ldasend,Npart,mpart,to_topo,& 
-             & ppm_param_map_pop, info)
+        CALL ppm_map_part_pop(bfr,ldasend,Npart,mpart,info)
         IF(info.NE.0) THEN
            GOTO 9999
         END IF
diff --git a/src/ppm_ode_map_push.f b/src/ppm_ode_map_push.f
index 0aa85cb..2b89001 100644
--- a/src/ppm_ode_map_push.f
+++ b/src/ppm_ode_map_push.f
@@ -91,7 +91,6 @@
         INTEGER                                   :: ldasend
         INTEGER                                   :: throwaway
         INTEGER                                   :: mid, umidmax, umidmin
-        INTEGER                                   :: to_topo
         !-----------------------------------------------------------------------
         !  call substart
         !-----------------------------------------------------------------------
@@ -175,9 +174,7 @@
         ldasend = lda*ppm_ode_sent(mid)
         IF(ldasend.EQ.0) GOTO 9999
         
-        to_topo = -1
-        CALL ppm_map_part(bfr,ldasend,Npart,mpart,to_topo,& 
-             & ppm_param_map_push, info)
+        CALL ppm_map_part_push(bfr,ldasend,Npart,info)
         IF(info.NE.0) THEN
            GOTO 9999
         END IF
diff --git a/src/ppm_ode_rhsfunc_macro.h b/src/ppm_ode_rhsfunc_macro.h
index 45ac55b..5244620 100644
--- a/src/ppm_ode_rhsfunc_macro.h
+++ b/src/ppm_ode_rhsfunc_macro.h
@@ -11,37 +11,37 @@
         IF(PRESENT(ipackdata)) THEN
            IF(PRESENT(lpackdata)) THEN
               IF(PRESENT(rpackdata)) THEN
-                 throwaway = rhsfunc(xp,up,dup,lda,Npart,&
+                 throwaway = rhsfunc(topoid,xp,up,dup,lda,Npart,&
                       & ipack=ipackdata,lpack=lpackdata,rpack=rpackdata,&
                       & info=info)
               ELSE
-                 throwaway = rhsfunc(xp,up,dup,lda,Npart,&
+                 throwaway = rhsfunc(topoid,xp,up,dup,lda,Npart,&
                       & ipack=ipackdata,lpack=lpackdata,info=info)
               END IF
            ELSE
               IF(PRESENT(rpackdata)) THEN
-                 throwaway = rhsfunc(xp,up,dup,lda,Npart,&
+                 throwaway = rhsfunc(topoid,xp,up,dup,lda,Npart,&
                       & ipack=ipackdata,rpack=rpackdata,info=info)
               ELSE
-                 throwaway = rhsfunc(xp,up,dup,lda,Npart,&
+                 throwaway = rhsfunc(topoid,xp,up,dup,lda,Npart,&
                       & ipack=ipackdata,info=info)
               END IF
            END IF
         ELSE
            IF(PRESENT(lpackdata)) THEN
               IF(PRESENT(rpackdata)) THEN
-                 throwaway = rhsfunc(xp,up,dup,lda,Npart,&
+                 throwaway = rhsfunc(topoid,xp,up,dup,lda,Npart,&
                       & lpack=lpackdata,rpack=rpackdata,info=info)
               ELSE
-                 throwaway = rhsfunc(xp,up,dup,lda,Npart,&
+                 throwaway = rhsfunc(topoid,xp,up,dup,lda,Npart,&
                       & lpack=lpackdata,info=info)
               END IF
            ELSE
               IF(PRESENT(rpackdata)) THEN
-                 throwaway = rhsfunc(xp,up,dup,lda,Npart,&
+                 throwaway = rhsfunc(topoid,xp,up,dup,lda,Npart,&
                       & rpack=rpackdata,info=info)
               ELSE
-                 throwaway = rhsfunc(xp,up,dup,lda,Npart,&
+                 throwaway = rhsfunc(topoid,xp,up,dup,lda,Npart,&
                       & info=info)
               END IF
            END IF
diff --git a/src/ppm_ode_step.f b/src/ppm_ode_step.f
index 242cadd..ae93ebb 100644
--- a/src/ppm_ode_step.f
+++ b/src/ppm_ode_step.f
@@ -133,6 +133,7 @@
         !-----------------------------------------------------------------------
         USE ppm_module_data_ode
         USE ppm_module_data
+        USE ppm_module_check_topoid
         USE ppm_module_substart
         USE ppm_module_substop
         USE ppm_module_error
@@ -146,8 +147,9 @@
 #endif
 #if     __KIND == __SINGLE_PRECISION
         INTERFACE
-           FUNCTION rhsfunc(xp,up,dup,lda,npart,ipack,&
+           FUNCTION rhsfunc(topoid,xp,up,dup,lda,npart,ipack,&
                 &lpack,rpack,info)
+             INTEGER                          , INTENT(IN)  :: topoid
              INTEGER                          , INTENT(IN)  :: lda,npart
              INTEGER                          , INTENT(OUT) :: info
 #if     __MODE == __SCA
@@ -166,8 +168,9 @@
         END INTERFACE
 #else
         INTERFACE
-           FUNCTION rhsfunc(xp,up,dup,lda,npart,ipack,&
+           FUNCTION rhsfunc(topoid,xp,up,dup,lda,npart,ipack,&
                 &lpack,rpack,info)
+             INTEGER                          , INTENT(IN)  :: topoid
              INTEGER                          , INTENT(IN)  :: lda,npart
              INTEGER                          , INTENT(OUT) :: info
 #if     __MODE == __SCA
@@ -214,6 +217,8 @@
         INTEGER                                   :: stsn
         REAL(mk), DIMENSION(20)                   :: stsnu
         REAL(mk)                                  :: tau
+        INTEGER                                   :: topoid
+        LOGICAL                                   :: topo_valid
         !-----------------------------------------------------------------------
         !  fill the nu parameters for the sts scheme
         !-----------------------------------------------------------------------
@@ -334,7 +339,15 @@
                    & 'BFR is empty',__LINE__,info)
               GOTO 9999
            END IF
+           CALL ppm_check_topoid(ppm_ode_topoid,topo_valid,info)
+           IF (.NOT. topo_valid) THEN
+              info = ppm_error_error
+              CALL ppm_error(ppm_err_argument,'ppm_ode_step', &
+                   & 'topoid not valid',__LINE__,info)
+              GOTO 9999
+           ENDIF
         END IF ! (ppm_debug.GT.0)
+        topoid = ppm_ode_topoid
         mid = ppm_internal_mid(odeid)
         !-----------------------------------------------------------------------
         ! check state if finished, bail out
@@ -620,13 +633,13 @@
               !-----------------------------------------------------------------
               DO i=1,Npart
 #if      __MODE == __SCA
-                 up(i)   = bfr(1,i) + 1.0_MK/6.0_MK*dt*                        &
-        &                  (bfr(2,i) + 2.0_MK*bfr(3,i) + 2.0_MK*bfr(4,i)+ dup(i))
+                 up(i) = bfr(1,i) + 1.0_MK/6.0_MK*dt*                    &
+     &                   (bfr(2,i) + 2.0_MK*bfr(3,i) + 2.0_MK*bfr(4,i) + up(i))
 #elif    __MODE == __VEC
         DO ilda=1,lda
-           up(ilda,i) = bfr(ilda,i) +  1.0_MK/6.0_MK*dt*                   & 
-           &                (bfr((lda+ilda),i) + 2.0_MK*bfr((2*lda+ilda),i)  &
-           &                             + 2.0_MK*bfr((3*lda+ilda),i)+ dup(ilda,i))
+           up(ilda,i) = bfr(ilda,i) + 1.0_MK/6.0_MK*dt*                    &
+           &            (bfr((lda+ilda),i) + 2.0_MK*bfr((2*lda+ilda),i) +  &
+           &            2.0_MK*bfr((3*lda+ilda),i)+ dup(ilda,i))
         END DO
 #endif                 
       END DO
-- 
GitLab