Changeset 240 for branches


Ignore:
Timestamp:
Jun 9, 2011 8:17:02 AM (7 years ago)
Author:
kulshres
Message:

merge mpi sources from gitclone

The mpi support has been tested only in linux/unix environments.
No support at the moment for Visual Studio or any other systems

Signed-off-by: Kshitij Kulshreshtha <kshitij@…>

The following commits are merged:

commit 311273b86bba6700332c32dc384132e840fddebe
Author: Kshitij Kulshreshtha <kshitij@…>
Date: Thu Jun 9 13:59:57 2011 +0200

correct inclusion of headers

Signed-off-by: Kshitij Kulshreshtha <kshitij@…>

commit 045e1543da434ac50d1a353bd6c076b60edccd3a
Author: Kshitij Kulshreshtha <kshitij@…>
Date: Thu Jun 9 13:14:42 2011 +0200

remove unbalanced barrier

it is not needed there anyway.

Signed-off-by: Kshitij Kulshreshtha <kshitij@…>

commit cfba8b1e574e0758d5877f4eff60a9279a165a28
Author: Benjamin Letschert <letschi@…>
Date: Mon Jun 6 16:35:53 2011 +0200

Correct checking if defined mpi/mpi.h or mpi.h

commit 846b5ff6f470731bc19a5d29a4a4ade8391118e1
Author: Benjamin Letschert <letschi@…>
Date: Mon Jun 6 15:23:16 2011 +0200

Adding mpi-parallel drivers and interfaces for C

Signed-off-by: Benjamin Letschert <letschi@…>

commit 50be816100ac42d9df820fec78e36f8dafe4a6e6
Author: Benjamin Letschert <letschi@…>
Date: Mon Jun 6 12:41:23 2011 +0200

Changed send/recv to bcast/reduce for efficiency.

commit c388ac049f05e2db03afc358dbf698223e3f6643
Author: Benjamin Letschert <letschi@…>
Date: Mon Jun 6 12:39:58 2011 +0200

Refactored forward and reverse interfaces into their own file.

Signed-off-by: Benjamin Letschert <letschi@…>

commit c3894d61704520129b79bfd340adfe00a3ed6394
Author: Benjamin Letschert <letschi@…>
Date: Wed Jun 1 15:52:49 2011 +0200

Adding broadcast and reduce functionality to parallel adol-c

commit 8f1c2534d0868aa8ededa2b954337bda43e09f46
Author: Benjamin Letschert <letschi@…>
Date: Wed Jun 1 14:07:42 2011 +0200

Bugfix for index and nonlinear index domains by sending data

commit 6080e85cd973eb782cf019b58ddadf110aee4232
Author: Benjamin Letschert <letschi@…>
Date: Fri May 27 12:40:54 2011 +0200

correct checking for C++ inside adolc_mpi.h

commit c64771e2fc4a95664a747a9f68f8dcca8c324a57
Author: Benjamin Letschert <letschi@…>
Date: Thu May 26 14:40:22 2011 +0200

Change Index Elements into locints in uni5_for.c

commit fd8f8f4c7f67104cb3ea0c66474fc2c0eeb41997
Author: Kshitij Kulshreshtha <kshitij@…>
Date: Wed Mar 23 13:55:00 2011 +0100

typo in the source of recv in parallel sparse_hess

Signed-off-by: Kshitij Kulshreshtha <kshitij@…>

commit 113ca4dc1694e57210b1a8db9c2625c0d2d13239
Author: Maria Brune <brunem@…>
Date: Wed Mar 23 13:06:40 2011 +0100

add MPICPPFLAGS for compilation in sparse subdirectory too

Signed-off-by: Kshitij Kulshreshtha <kshitij@…>

commit f2ebec2a1b0787fd669db4baf0ee6a28a9ca8ff7
Author: Maria Brune <brunem@…>
Date: Wed Mar 23 12:53:04 2011 +0100

correct the conditional compilation for mpi

these are leftovers from

commit 81a8d19bb425c3526d939933f243e525ac99e0c9
Author: Kshitij Kulshreshtha <kshitij@…>
Date: Tue Mar 8 16:37:00 2011 +0100

allow user to give path to mpi headers and libraries

Signed-off-by: Kshitij Kulshreshtha <kshitij@…>

commit ddbebc1b0028b17b50892c181160e9168cfc176e
Author: Maria Brune <brunem@…>
Date: Fri Mar 18 17:27:59 2011 +0100

Handle the pattern only case in all processes

for sparse_jac with options[2] == -1 and for sparse_hess with
repeat == -1, only the pattern is computed and stored. The Jacobian
or the Hessian itself is not propagated. This should be handled in
all processes, otherwise the id != 0 processes will continue to try
to propogate derivatives and hang in a send/recv.

Signed-off-by: Kshitij Kulshreshtha <kshitij@…>

commit 4af90111e63efbc92e9bc41d8060941e06f5f426
Author: Maria Brune <brunem@…>
Date: Fri Mar 18 17:25:27 2011 +0100

Errors are fatal in parallel case

in case the error happens only in one process, all other processes
will hang. So make the errors fatal so that we abort.

Signed-off-by: Kshitij Kulshreshtha <kshitij@…>

commit 89d8e7d8d676304e1bccb8742b8cb20e2e27e702
Author: Benjamin Letschert <letschi@…>
Date: Wed Mar 9 14:56:14 2011 +0100

get rid of compiler warning about deprecated conversions

Signed-off-by: Kshitij Kulshreshtha <kshitij@…>

commit 81a8d19bb425c3526d939933f243e525ac99e0c9
Author: Kshitij Kulshreshtha <kshitij@…>
Date: Tue Mar 8 16:37:00 2011 +0100

allow user to give path to mpi headers and libraries

there are new flags --with-mpi-includedir=PATH --with-mpi-libdir=PATH
for providing these two paths for compilation in case mpi is not
installed in a default location.

commit f3cd62c952c2d67ae766b30b8aeb23053a606f62
Author: Benjamin Letschert <letschi@…>
Date: Mon Feb 28 12:21:38 2011 +0100

Avoid potential segmentation fault

commit ced5627653ae6faf36d033667a58d6a8f6ff685a
Author: Benjamin Letschert <letschi@…>
Date: Fri Feb 25 12:40:21 2011 +0100

Remove unused variable

commit 57c288ffdf600ffc5316ab09b9d38a90d84505be
Author: Benjamin Letschert <letschi@…>
Date: Fri Feb 25 12:35:08 2011 +0100

Remove code that was already commented out

commit f5e1baaea72caa4b57ec46f1d0375aab594f643f
Author: Benjamin Letschert <letschi@…>
Date: Fri Feb 25 12:32:33 2011 +0100

Add missing index variable declaration

commit e9b954c010231ed8570af52b8e235fe5c84be85b
Author: Benjamin Letschert <letschi@…>
Date: Fri Feb 25 12:31:44 2011 +0100

Make it more explicitly clear that MPI is used.

Signed-off-by: Kshitij Kulshreshtha <kshitij@…>

commit f9c0f75d0c7b818f25023a33873ebe99c93e1810
Author: Benjamin Letschert <letschi@…>
Date: Fri Feb 25 12:30:17 2011 +0100

Adding parallel computing for sparse_hess and sparse_jac

hess_pat and jac_pat are also computed in parallel by ind_dom and nonl_dom

commit 2b02eddaf9c2334150334b63fe4b927fdece858c
Author: Kshitij Kulshreshtha <kshitij@…>
Date: Wed Feb 16 15:32:57 2011 +0100

Set flag to check whether mpi was actually initialized

Signed-off-by: Kshitij Kulshreshtha <kshitij@…>

commit d9d36d14f34163e16d91e0f10236e38298f03fd6
Author: Benjamin Letschert <letschi@…>
Date: Fri Feb 11 21:29:22 2011 +0100

Update and fix operations send_data and receive_data in fo_rev.c, ho_rev.c and uni5_for.c

commit 553f47ddcb015209ae667d5415855cda8e68274e
Author: Benjamin Letschert <letschi@…>
Date: Thu Feb 3 14:19:48 2011 +0100

Adding parallel zos_forward, fos_forward, fos_reverse, hos_reverse and fov_reverse

added at adolc_mpi.h and adolc_mpi.cpp

commit 9171fd1e1221e1fdc954deb7b1443867262ea1cf
Author: Benjamin Letschert <letschi@…>
Date: Thu Feb 3 14:10:07 2011 +0100

Adding parallel computing jacobian

new function jacobian in adolc_mpi.h and adolc_mpi.cpp
fixing a bug for jacobian in fov_reverse and hos_reverse

commit 95df1770f7026d11ec5c801299ae93c1657a112d
Author: Benjamin Letschert <letschi@…>
Date: Thu Jan 27 16:51:11 2011 +0100

add missing send in hos_reverse

commit 5afa0be6e103b204042f91703b9ee0e42c648f1c
Author: Benjamin Letschert <letschi@…>
Date: Thu Jan 27 16:50:26 2011 +0100

fov_forward and fov_reverse parallel

commit cf560a6f828ca43c25471da240c12c3b5df889cb
Author: Benny <letschi@letschi-NF61S-M2A.(none)>
Date: Wed Jan 19 20:37:41 2011 +0100

ADOLC_MPI-Barrier-function added to ADOLC-MPI

adding new tape entry "barrier_op"
modified files: adolc_mpi.h adolc_mpi.cpp uni5_for.c fo_rev.c ho_rev.c oplate.h tapedoc.c

commit 9a02525e6baada5332ab3a71119c9ad3ae262d33
Author: Benny <letschi@letschi-NF61S-M2A.(none)>
Date: Wed Jan 19 19:38:54 2011 +0100

Parallel computing hessian

Added source for parallel computing hessian matrix by using MPI-Routines
adding Send and Receive Operations for hos_reverse

commit 7767f1e0ae4337f92e60e5d7d9b6f275c9bb8ef7
Author: Benny <letschi@letschi-NF61S-M2A.(none)>
Date: Wed Jan 19 19:19:23 2011 +0100

Update gradiant parallel computing

Adjoint Tailorbuffer entries are added together

commit a0f3bc4260eda3fca02cc8d65d8cf6675d9efd75
Author: Kshitij Kulshreshtha <kshitij@…>
Date: Tue Nov 30 11:44:00 2010 +0100

do not free user provided pointers

since setTapeInfo{Jac,Hess}Sparse() calls freeSparse{Jac,Hess}Infos()
any pointers stored in the tapeInfos.s[JH]infos structure will be freed.
This means we should do deep copy of the pattern in set_HP provided by the
user. similarly we should return a deep copied pointer in get_HP, as the
user may free it whenever they want.

similar use of deep copying before any setTapeInfosHessSparse() call
should be done in order to avoid saving a free'd pointer again. Only HP
is important at the moment, everything else is NULL or just allocated.

Signed-off-by: Kshitij Kulshreshtha <kshitij@…>

commit 7c60e5beeb147be3dea3d429c77e12c1a3d0d343
Author: Benjamin Letschert <letschi@…>
Date: Thu Nov 18 12:56:45 2010 +0100

Update configuration for install MPI and deleting TapelessMode? for MPI
change Makefile to install adolc_mpi.h only if mpi ist installed
delete TapelessMode? by data transmission for mpi

commit 5fcf2d78f7d22c9192006ce337139f0d15d11733
Author: Benjamin Letschert <letschi@…>
Date: Thu Nov 18 12:56:45 2010 +0100

Changing MPI-Compiling
Change to Compile ADOL-C-MPI-functions only if MPI is installed on main system

commit 8897f767abae126accaa345cd7fa39fbb4142ab9
Author: Benjamin Letschert <letschi@…>
Date: Tue Nov 16 11:21:18 2010 +0100

First use of MPI

Simple MPI-Functions included for parallel computing;
tested for fos-, zos-forward and fos-reverse method to compute parallel gradient
in speelpennings function

Signed-off-by: Benjamin Letschert <letschi@…>

Location:
branches/MPI
Files:
4 added
50 edited

Legend:

Unmodified
Added
Removed
  • branches/MPI/ADOL-C/Makefile.in

    r171 r240  
    138138LD = @LD@
    139139LDFLAGS = @LDFLAGS@
     140LIBMPI = @LIBMPI@
    140141LIBOBJS = @LIBOBJS@
    141142LIBS = @LIBS@
     
    150151MCS = @MCS@
    151152MKDIR_P = @MKDIR_P@
     153MPICPPFLAGS = @MPICPPFLAGS@
     154MPILIBS = @MPILIBS@
    152155NM = @NM@
    153156NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/doc/version.tex

    r211 r240  
    11\newcommand{\packagename}{adolc}
    2 \newcommand{\packageversion}{2.2.0-trunk}
     2\newcommand{\packageversion}{2.2.0-trunk-mpi}
    33\newcommand{\packagetar}{\packagename-\packageversion}
  • branches/MPI/ADOL-C/examples/Makefile.in

    r171 r240  
    181181LD = @LD@
    182182LDFLAGS = @LDFLAGS@
     183LIBMPI = @LIBMPI@
    183184LIBOBJS = @LIBOBJS@
    184185LIBS = @LIBS@
     
    193194MCS = @MCS@
    194195MKDIR_P = @MKDIR_P@
     196MPICPPFLAGS = @MPICPPFLAGS@
     197MPILIBS = @MPILIBS@
    195198NM = @NM@
    196199NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/Makefile.in

    r128 r240  
    140140LD = @LD@
    141141LDFLAGS = @LDFLAGS@
     142LIBMPI = @LIBMPI@
    142143LIBOBJS = @LIBOBJS@
    143144LIBS = @LIBS@
     
    152153MCS = @MCS@
    153154MKDIR_P = @MKDIR_P@
     155MPICPPFLAGS = @MPICPPFLAGS@
     156MPILIBS = @MPILIBS@
    154157NM = @NM@
    155158NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/checkpointing/Makefile.in

    r171 r240  
    117117LD = @LD@
    118118LDFLAGS = @LDFLAGS@
     119LIBMPI = @LIBMPI@
    119120LIBOBJS = @LIBOBJS@
    120121LIBS = @LIBS@
     
    129130MCS = @MCS@
    130131MKDIR_P = @MKDIR_P@
     132MPICPPFLAGS = @MPICPPFLAGS@
     133MPILIBS = @MPILIBS@
    131134NM = @NM@
    132135NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/clock/Makefile.in

    r128 r240  
    9898LD = @LD@
    9999LDFLAGS = @LDFLAGS@
     100LIBMPI = @LIBMPI@
    100101LIBOBJS = @LIBOBJS@
    101102LIBS = @LIBS@
     
    110111MCS = @MCS@
    111112MKDIR_P = @MKDIR_P@
     113MPICPPFLAGS = @MPICPPFLAGS@
     114MPILIBS = @MPILIBS@
    112115NM = @NM@
    113116NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/detexam/Makefile.in

    r171 r240  
    121121LD = @LD@
    122122LDFLAGS = @LDFLAGS@
     123LIBMPI = @LIBMPI@
    123124LIBOBJS = @LIBOBJS@
    124125LIBS = @LIBS@
     
    133134MCS = @MCS@
    134135MKDIR_P = @MKDIR_P@
     136MPICPPFLAGS = @MPICPPFLAGS@
     137MPILIBS = @MPILIBS@
    135138NM = @NM@
    136139NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/ext_diff_func/Makefile.in

    r171 r240  
    117117LD = @LD@
    118118LDFLAGS = @LDFLAGS@
     119LIBMPI = @LIBMPI@
    119120LIBOBJS = @LIBOBJS@
    120121LIBS = @LIBS@
     
    129130MCS = @MCS@
    130131MKDIR_P = @MKDIR_P@
     132MPICPPFLAGS = @MPICPPFLAGS@
     133MPILIBS = @MPILIBS@
    131134NM = @NM@
    132135NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/fixpoint_exam/Makefile.in

    r171 r240  
    117117LD = @LD@
    118118LDFLAGS = @LDFLAGS@
     119LIBMPI = @LIBMPI@
    119120LIBOBJS = @LIBOBJS@
    120121LIBS = @LIBS@
     
    129130MCS = @MCS@
    130131MKDIR_P = @MKDIR_P@
     132MPICPPFLAGS = @MPICPPFLAGS@
     133MPILIBS = @MPILIBS@
    131134NM = @NM@
    132135NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/helm/Makefile.in

    r171 r240  
    121121LD = @LD@
    122122LDFLAGS = @LDFLAGS@
     123LIBMPI = @LIBMPI@
    123124LIBOBJS = @LIBOBJS@
    124125LIBS = @LIBS@
     
    133134MCS = @MCS@
    134135MKDIR_P = @MKDIR_P@
     136MPICPPFLAGS = @MPICPPFLAGS@
     137MPILIBS = @MPILIBS@
    135138NM = @NM@
    136139NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/hessmat/Makefile.in

    r171 r240  
    117117LD = @LD@
    118118LDFLAGS = @LDFLAGS@
     119LIBMPI = @LIBMPI@
    119120LIBOBJS = @LIBOBJS@
    120121LIBS = @LIBS@
     
    129130MCS = @MCS@
    130131MKDIR_P = @MKDIR_P@
     132MPICPPFLAGS = @MPICPPFLAGS@
     133MPILIBS = @MPILIBS@
    131134NM = @NM@
    132135NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/lighthouse/Makefile.in

    r171 r240  
    132132LD = @LD@
    133133LDFLAGS = @LDFLAGS@
     134LIBMPI = @LIBMPI@
    134135LIBOBJS = @LIBOBJS@
    135136LIBS = @LIBS@
     
    144145MCS = @MCS@
    145146MKDIR_P = @MKDIR_P@
     147MPICPPFLAGS = @MPICPPFLAGS@
     148MPILIBS = @MPILIBS@
    146149NM = @NM@
    147150NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/lufact/Makefile.in

    r171 r240  
    121121LD = @LD@
    122122LDFLAGS = @LDFLAGS@
     123LIBMPI = @LIBMPI@
    123124LIBOBJS = @LIBOBJS@
    124125LIBS = @LIBS@
     
    133134MCS = @MCS@
    134135MKDIR_P = @MKDIR_P@
     136MPICPPFLAGS = @MPICPPFLAGS@
     137MPILIBS = @MPILIBS@
    135138NM = @NM@
    136139NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/ode/Makefile.in

    r171 r240  
    129129LD = @LD@
    130130LDFLAGS = @LDFLAGS@
     131LIBMPI = @LIBMPI@
    131132LIBOBJS = @LIBOBJS@
    132133LIBS = @LIBS@
     
    141142MCS = @MCS@
    142143MKDIR_P = @MKDIR_P@
     144MPICPPFLAGS = @MPICPPFLAGS@
     145MPILIBS = @MPILIBS@
    143146NM = @NM@
    144147NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/openmp_exam/Makefile.in

    r171 r240  
    121121LD = @LD@
    122122LDFLAGS = @LDFLAGS@
     123LIBMPI = @LIBMPI@
    123124LIBOBJS = @LIBOBJS@
    124125LIBS = @LIBS@
     
    133134MCS = @MCS@
    134135MKDIR_P = @MKDIR_P@
     136MPICPPFLAGS = @MPICPPFLAGS@
     137MPILIBS = @MPILIBS@
    135138NM = @NM@
    136139NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/pow/Makefile.in

    r171 r240  
    117117LD = @LD@
    118118LDFLAGS = @LDFLAGS@
     119LIBMPI = @LIBMPI@
    119120LIBOBJS = @LIBOBJS@
    120121LIBS = @LIBS@
     
    129130MCS = @MCS@
    130131MKDIR_P = @MKDIR_P@
     132MPICPPFLAGS = @MPICPPFLAGS@
     133MPILIBS = @MPILIBS@
    131134NM = @NM@
    132135NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/scal/Makefile.in

    r171 r240  
    117117LD = @LD@
    118118LDFLAGS = @LDFLAGS@
     119LIBMPI = @LIBMPI@
    119120LIBOBJS = @LIBOBJS@
    120121LIBS = @LIBS@
     
    129130MCS = @MCS@
    130131MKDIR_P = @MKDIR_P@
     132MPICPPFLAGS = @MPICPPFLAGS@
     133MPILIBS = @MPILIBS@
    131134NM = @NM@
    132135NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/sparse/Makefile.in

    r171 r240  
    134134LD = @LD@
    135135LDFLAGS = @LDFLAGS@
     136LIBMPI = @LIBMPI@
    136137LIBOBJS = @LIBOBJS@
    137138LIBS = @LIBS@
     
    146147MCS = @MCS@
    147148MKDIR_P = @MKDIR_P@
     149MPICPPFLAGS = @MPICPPFLAGS@
     150MPILIBS = @MPILIBS@
    148151NM = @NM@
    149152NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/sparse/sparse_hessian.cpp

    r203 r240  
    2626adouble feval_ad(adouble *x);
    2727
    28 void printmat(char* kette, int n, int m, double** M);
     28void printmat(const char*const kette, int n, int m, double** M);
    2929
    3030int main() {
     
    253253/***************************************************************************/
    254254
    255 void printmat(char* name, int m, int n, double** M) {
     255void printmat(const char*const name, int m, int n, double** M) {
    256256    int i,j;
    257257
  • branches/MPI/ADOL-C/examples/additional_examples/sparse/sparse_jacobian.cpp

    r203 r240  
    2626void   ceval(double *x, double *c);
    2727
    28 void printmat(char* name, int n, int m, double** M);
     28void printmat(const char*const name, int n, int m, double** M);
    2929
    3030int main() {
     
    265265/***************************************************************************/
    266266
    267 void printmat(char* name, int m, int n, double** M) {
     267void printmat(const char*const name, int m, int n, double** M) {
    268268    int i,j;
    269269
  • branches/MPI/ADOL-C/examples/additional_examples/speelpenning/Makefile.in

    r171 r240  
    117117LD = @LD@
    118118LDFLAGS = @LDFLAGS@
     119LIBMPI = @LIBMPI@
    119120LIBOBJS = @LIBOBJS@
    120121LIBS = @LIBS@
     
    129130MCS = @MCS@
    130131MKDIR_P = @MKDIR_P@
     132MPICPPFLAGS = @MPICPPFLAGS@
     133MPILIBS = @MPILIBS@
    131134NM = @NM@
    132135NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/tapesave/Makefile.in

    r171 r240  
    121121LD = @LD@
    122122LDFLAGS = @LDFLAGS@
     123LIBMPI = @LIBMPI@
    123124LIBOBJS = @LIBOBJS@
    124125LIBS = @LIBS@
     
    133134MCS = @MCS@
    134135MKDIR_P = @MKDIR_P@
     136MPICPPFLAGS = @MPICPPFLAGS@
     137MPILIBS = @MPILIBS@
    135138NM = @NM@
    136139NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/taylor/Makefile.in

    r171 r240  
    137137LD = @LD@
    138138LDFLAGS = @LDFLAGS@
     139LIBMPI = @LIBMPI@
    139140LIBOBJS = @LIBOBJS@
    140141LIBS = @LIBS@
     
    149150MCS = @MCS@
    150151MKDIR_P = @MKDIR_P@
     152MPICPPFLAGS = @MPICPPFLAGS@
     153MPILIBS = @MPILIBS@
    151154NM = @NM@
    152155NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/examples/additional_examples/timing/Makefile.in

    r171 r240  
    207207LD = @LD@
    208208LDFLAGS = @LDFLAGS@
     209LIBMPI = @LIBMPI@
    209210LIBOBJS = @LIBOBJS@
    210211LIBS = @LIBS@
     
    219220MCS = @MCS@
    220221MKDIR_P = @MKDIR_P@
     222MPICPPFLAGS = @MPICPPFLAGS@
     223MPILIBS = @MPILIBS@
    221224NM = @NM@
    222225NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/src/Makefile.am

    r198 r240  
    3939                       interfaces.h oplate.h taping.h usrparms.h \
    4040                       externfcts.h checkpointing.h fixpoint.h\
    41                        adolc_sparse.h adolc_openmp.h \
     41                       adolc_sparse.h adolc_openmp.h  \
    4242                       revolve.h
    4343
     
    6161                       indopro_forward_s.c indopro_forward_t.c \
    6262                       nonl_ind_forward_s.c nonl_ind_forward_t.c \
    63                        int_reverse_s.c int_reverse_t.c 
     63                       int_reverse_s.c int_reverse_t.c
    6464
    6565libadolc_la_LIBADD   = drivers/libdrivers.la sparse/libsparse.la \
     
    8080
    8181libadolc_la_LIBADD   = drivers/libdrivers.la tapedoc/libtapedoc.la
    82 
    8382endif
    8483
     84if HAVE_MPI
     85AM_CPPFLAGS += @MPICPPFLAGS@
     86libadolc_la_SOURCES +=  adolc_mpi.cpp interfaces_mpi.cpp
     87libadolc_la_LDFLAGS  += @MPILIBS@ @LIBMPI@
     88pkginclude_HEADERS += adolc_mpi.h interfaces_mpi.h
     89endif
  • branches/MPI/ADOL-C/src/Makefile.in

    r202 r240  
    4040host_triplet = @host@
    4141@SPARSE_TRUE@am__append_1 = @COLPACK_LIBS@
     42@HAVE_MPI_TRUE@am__append_2 = @MPICPPFLAGS@
     43@HAVE_MPI_TRUE@am__append_3 = adolc_mpi.cpp interfaces_mpi.cpp
     44@HAVE_MPI_TRUE@am__append_4 = @MPILIBS@ @LIBMPI@
     45@HAVE_MPI_TRUE@am__append_5 = adolc_mpi.h interfaces_mpi.h
    4246subdir = ADOL-C/src
    43 DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
     47DIST_COMMON = $(am__pkginclude_HEADERS_DIST) $(srcdir)/Makefile.am \
    4448        $(srcdir)/Makefile.in $(srcdir)/config.h.in
    4549ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
     
    8690        fov_reverse.c hos_reverse.c hos_ov_reverse.c hov_reverse.c \
    8791        forward_partx.c externfcts.cpp checkpointing.cpp fixpoint.cpp \
    88         fov_offset_forward.c revolve.c taping_p.h int_forward_s.c \
    89         int_forward_t.c indopro_forward_s.c indopro_forward_t.c \
    90         nonl_ind_forward_s.c nonl_ind_forward_t.c int_reverse_s.c \
    91         int_reverse_t.c
     92        fov_offset_forward.c revolve.c adolc_mpi.cpp \
     93        interfaces_mpi.cpp taping_p.h int_forward_s.c int_forward_t.c \
     94        indopro_forward_s.c indopro_forward_t.c nonl_ind_forward_s.c \
     95        nonl_ind_forward_t.c int_reverse_s.c int_reverse_t.c
     96@HAVE_MPI_TRUE@am__objects_1 = adolc_mpi.lo interfaces_mpi.lo
    9297@SPARSE_FALSE@am_libadolc_la_OBJECTS = adalloc.lo malloc.lo adouble.lo \
    9398@SPARSE_FALSE@  convolut.lo fortutils.lo interfaces.lo \
     
    98103@SPARSE_FALSE@  hos_ov_reverse.lo hov_reverse.lo \
    99104@SPARSE_FALSE@  forward_partx.lo externfcts.lo checkpointing.lo \
    100 @SPARSE_FALSE@  fixpoint.lo fov_offset_forward.lo revolve.lo
     105@SPARSE_FALSE@  fixpoint.lo fov_offset_forward.lo revolve.lo \
     106@SPARSE_FALSE@  $(am__objects_1)
    101107@SPARSE_TRUE@am_libadolc_la_OBJECTS = adalloc.lo malloc.lo adouble.lo \
    102108@SPARSE_TRUE@   convolut.lo fortutils.lo interfaces.lo \
     
    111117@SPARSE_TRUE@   indopro_forward_t.lo nonl_ind_forward_s.lo \
    112118@SPARSE_TRUE@   nonl_ind_forward_t.lo int_reverse_s.lo \
    113 @SPARSE_TRUE@   int_reverse_t.lo
     119@SPARSE_TRUE@   int_reverse_t.lo $(am__objects_1)
    114120libadolc_la_OBJECTS = $(am_libadolc_la_OBJECTS)
    115121libadolc_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
     
    141147        installcheck-recursive installdirs-recursive pdf-recursive \
    142148        ps-recursive uninstall-recursive
     149am__pkginclude_HEADERS_DIST = adolc.h adalloc.h adouble.h adutils.h \
     150        adutilsc.h common.h convolut.h dvlparms.h fortutils.h \
     151        interfaces.h oplate.h taping.h usrparms.h externfcts.h \
     152        checkpointing.h fixpoint.h adolc_sparse.h adolc_openmp.h \
     153        revolve.h adolc_mpi.h interfaces_mpi.h
    143154HEADERS = $(pkginclude_HEADERS)
    144155RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
     
    222233LD = @LD@
    223234LDFLAGS = @LDFLAGS@
     235LIBMPI = @LIBMPI@
    224236LIBOBJS = @LIBOBJS@
    225237LIBS = @LIBS@
     
    234246MCS = @MCS@
    235247MKDIR_P = @MKDIR_P@
     248MPICPPFLAGS = @MPICPPFLAGS@
     249MPILIBS = @MPILIBS@
    236250NM = @NM@
    237251NMEDIT = @NMEDIT@
     
    319333@SPARSE_FALSE@AM_CXXFLAGS = @ac_adolc_cxxflags@ -DADOLC_INTERNAL=1
    320334@SPARSE_TRUE@AM_CXXFLAGS = @ac_adolc_cxxflags@ -DADOLC_INTERNAL=1 -DSPARSE=1
    321 AM_CPPFLAGS = -I$(top_srcdir)/ADOL-C
     335AM_CPPFLAGS = -I$(top_srcdir)/ADOL-C $(am__append_2)
    322336INCLUDES = -I$(top_builddir)/ADOL-C
    323337@SPARSE_FALSE@SUBDIRS = drivers tapedoc
     
    329343
    330344pkginclude_HEADERS = adolc.h adalloc.h adouble.h adutils.h adutilsc.h \
    331                        common.h convolut.h dvlparms.h fortutils.h\
    332                        interfaces.h oplate.h taping.h usrparms.h \
    333                        externfcts.h checkpointing.h fixpoint.h\
    334                        adolc_sparse.h adolc_openmp.h \
    335                        revolve.h
    336 
     345        common.h convolut.h dvlparms.h fortutils.h interfaces.h \
     346        oplate.h taping.h usrparms.h externfcts.h checkpointing.h \
     347        fixpoint.h adolc_sparse.h adolc_openmp.h revolve.h \
     348        $(am__append_5)
    337349lib_LTLIBRARIES = libadolc.la
    338350libadolc_la_LDFLAGS = -version-info 2:1:1 -no-undefined \
    339         $(am__append_1)
     351        $(am__append_1) $(am__append_4)
    340352@SPARSE_FALSE@libadolc_la_SOURCES = adalloc.c malloc.c adouble.cpp \
    341 @SPARSE_FALSE@                       convolut.c fortutils.c\
    342 @SPARSE_FALSE@                       interfaces.cpp interfacesf.c \
    343 @SPARSE_FALSE@                       taping.c tape_handling.cpp \
    344 @SPARSE_FALSE@                       zos_forward.c fos_forward.c fov_forward.c \
    345 @SPARSE_FALSE@                       hos_forward.c hov_forward.c hov_wk_forward.c \
    346 @SPARSE_FALSE@                       fos_reverse.c fov_reverse.c \
    347 @SPARSE_FALSE@                       hos_reverse.c hos_ov_reverse.c hov_reverse.c \
    348 @SPARSE_FALSE@                       forward_partx.c \
    349 @SPARSE_FALSE@                       externfcts.cpp checkpointing.cpp \
    350 @SPARSE_FALSE@                       fixpoint.cpp fov_offset_forward.c revolve.c
    351 
     353@SPARSE_FALSE@  convolut.c fortutils.c interfaces.cpp \
     354@SPARSE_FALSE@  interfacesf.c taping.c tape_handling.cpp \
     355@SPARSE_FALSE@  zos_forward.c fos_forward.c fov_forward.c \
     356@SPARSE_FALSE@  hos_forward.c hov_forward.c hov_wk_forward.c \
     357@SPARSE_FALSE@  fos_reverse.c fov_reverse.c hos_reverse.c \
     358@SPARSE_FALSE@  hos_ov_reverse.c hov_reverse.c forward_partx.c \
     359@SPARSE_FALSE@  externfcts.cpp checkpointing.cpp fixpoint.cpp \
     360@SPARSE_FALSE@  fov_offset_forward.c revolve.c $(am__append_3)
    352361@SPARSE_TRUE@libadolc_la_SOURCES = adalloc.c malloc.c adouble.cpp \
    353 @SPARSE_TRUE@                       convolut.c fortutils.c \
    354 @SPARSE_TRUE@                       interfaces.cpp interfacesf.c \
    355 @SPARSE_TRUE@                       taping_p.h taping.c tape_handling.cpp \
    356 @SPARSE_TRUE@                       zos_forward.c fos_forward.c fov_forward.c \
    357 @SPARSE_TRUE@                       hos_forward.c hov_forward.c hov_wk_forward.c \
    358 @SPARSE_TRUE@                       fos_reverse.c fov_reverse.c \
    359 @SPARSE_TRUE@                       hos_reverse.c hos_ov_reverse.c hov_reverse.c \
    360 @SPARSE_TRUE@                       forward_partx.c \
    361 @SPARSE_TRUE@                       externfcts.cpp checkpointing.cpp \
    362 @SPARSE_TRUE@                       fixpoint.cpp fov_offset_forward.c revolve.c \
    363 @SPARSE_TRUE@                       int_forward_s.c int_forward_t.c \
    364 @SPARSE_TRUE@                       indopro_forward_s.c indopro_forward_t.c \
    365 @SPARSE_TRUE@                       nonl_ind_forward_s.c nonl_ind_forward_t.c \
    366 @SPARSE_TRUE@                       int_reverse_s.c int_reverse_t.c
    367 
     362@SPARSE_TRUE@   convolut.c fortutils.c interfaces.cpp \
     363@SPARSE_TRUE@   interfacesf.c taping_p.h taping.c \
     364@SPARSE_TRUE@   tape_handling.cpp zos_forward.c fos_forward.c \
     365@SPARSE_TRUE@   fov_forward.c hos_forward.c hov_forward.c \
     366@SPARSE_TRUE@   hov_wk_forward.c fos_reverse.c fov_reverse.c \
     367@SPARSE_TRUE@   hos_reverse.c hos_ov_reverse.c hov_reverse.c \
     368@SPARSE_TRUE@   forward_partx.c externfcts.cpp checkpointing.cpp \
     369@SPARSE_TRUE@   fixpoint.cpp fov_offset_forward.c revolve.c \
     370@SPARSE_TRUE@   int_forward_s.c int_forward_t.c \
     371@SPARSE_TRUE@   indopro_forward_s.c indopro_forward_t.c \
     372@SPARSE_TRUE@   nonl_ind_forward_s.c nonl_ind_forward_t.c \
     373@SPARSE_TRUE@   int_reverse_s.c int_reverse_t.c $(am__append_3)
    368374@SPARSE_FALSE@libadolc_la_LIBADD = drivers/libdrivers.la tapedoc/libtapedoc.la
    369375@SPARSE_TRUE@libadolc_la_LIBADD = drivers/libdrivers.la sparse/libsparse.la \
     
    463469
    464470@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adalloc.Plo@am__quote@
     471@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adolc_mpi.Plo@am__quote@
    465472@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adouble.Plo@am__quote@
    466473@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/checkpointing.Plo@am__quote@
     
    488495@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/int_reverse_t.Plo@am__quote@
    489496@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interfaces.Plo@am__quote@
     497@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interfaces_mpi.Plo@am__quote@
    490498@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interfacesf.Plo@am__quote@
    491499@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloc.Plo@am__quote@
  • branches/MPI/ADOL-C/src/common.h

    r152 r240  
    7575#endif /* ADOLC_INTERNAL */
    7676
     77#ifndef HAVE_MPI
     78#   if defined(HAVE_MPI_H) || defined(HAVE_MPI_MPI_H)
     79#      define HAVE_MPI 1
     80#   endif
     81#endif
    7782/*--------------------------------------------------------------------------*/
    7883/* developer and user parameters */
  • branches/MPI/ADOL-C/src/config.h.in

    r153 r240  
    4949/* Define to 1 if you have the <memory.h> header file. */
    5050#undef HAVE_MEMORY_H
     51
     52/* MPI is enabled */
     53#undef HAVE_MPI
     54
     55/* Define to 1 if you have the <mpi.h> header file. */
     56#undef HAVE_MPI_H
     57
     58/* Define to 1 if you have the <mpi/mpi.h> header file. */
     59#undef HAVE_MPI_MPI_H
    5160
    5261/* Define to 1 if you have the `pow' function. */
  • branches/MPI/ADOL-C/src/drivers/Makefile.in

    r171 r240  
    141141LD = @LD@
    142142LDFLAGS = @LDFLAGS@
     143LIBMPI = @LIBMPI@
    143144LIBOBJS = @LIBOBJS@
    144145LIBS = @LIBS@
     
    153154MCS = @MCS@
    154155MKDIR_P = @MKDIR_P@
     156MPICPPFLAGS = @MPICPPFLAGS@
     157MPILIBS = @MPILIBS@
    155158NM = @NM@
    156159NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/src/fo_rev.c

    r106 r240  
    1717
    1818 Copyright (c) Andrea Walther, Andreas Griewank, Andreas Kowarz,
    19                Hristo Mitev, Sebastian Schlenkrich, Jean Utke, Olaf Vogel
     19               Hristo Mitev, Sebastian Schlenkrich, Jean Utke, Olaf Vogel,
     20               Benjamin Letschert
    2021 
    2122 This file is part of ADOL-C. This software is provided as open source.
     
    196197#include <math.h>
    197198
     199#if defined(HAVE_MPI_MPI_H)
     200#include <mpi/mpi.h>
     201#elif defined(HAVE_MPI_H)
     202#include <mpi.h>
     203#endif
     204
    198205BEGIN_C_DECLS
    199206
     
    360367#endif
    361368
     369#endif
     370
     371#if defined(HAVE_MPI)
     372        double *trade, *rec_buf;
     373        MPI_Status status_MPI;
     374        int mpi_i, id, root, count, loc_recv, loc_send;
    362375#endif
    363376
     
    17731786#endif /* !_INT_REV_ */
    17741787                /*--------------------------------------------------------------------------*/
     1788#if defined(HAVE_MPI)
     1789            case receive_data:  // MPI-Send
     1790                res = get_locint_r(); // tag
     1791                arg2 = get_locint_r(); // dest
     1792                arg1 = get_locint_r(); // count
     1793                arg = get_locint_r(); // first Buffer
     1794#if defined(_FOS_)
     1795                trade = (double*) myalloc1(2*arg1);
     1796
     1797                for (mpi_i=0; mpi_i< arg1; mpi_i++) {
     1798                    trade[2*mpi_i] = rp_T[arg + mpi_i];
     1799                    trade[2*mpi_i + 1]=rp_A[arg + mpi_i];
     1800                    rp_A[arg + mpi_i]=0;
     1801                    ADOLC_GET_TAYLOR(arg+mpi_i);
     1802                   }
     1803                MPI_Send( trade , arg1*2, MPI_DOUBLE , arg2, res , MPI_COMM_WORLD);
     1804                myfree1(trade);
     1805#endif /* ALL_TOGETHER_AGAIN */
     1806#if defined(_FOV_)
     1807                trade = (double*) myalloc1((1+p)*arg1);
     1808
     1809                for (mpi_i=0; mpi_i< arg1; mpi_i++)
     1810                    trade[mpi_i] = rp_T[arg +mpi_i];
     1811
     1812                n = arg1;
     1813                for (mpi_i=0; mpi_i < arg1; mpi_i++){
     1814                    FOR_0_LE_l_LT_p
     1815                    {
     1816                        trade[n]=rpp_A[arg+mpi_i][l];
     1817                        rpp_A[arg+mpi_i][l]=0;
     1818                        n++;
     1819                    }
     1820                    ADOLC_GET_TAYLOR(arg+mpi_i);
     1821                }
     1822                MPI_Send( trade , arg1*(p+1), MPI_DOUBLE , arg2, res , MPI_COMM_WORLD);
     1823                myfree1(trade);
     1824#endif /* ALL_TOGETHER_AGAIN */
     1825                break;
     1826                /*--------------------------------------------------------------------------*/
     1827            case send_data:     // MPI-Send-Befehl
     1828                res = get_locint_r(); // tag
     1829                arg2 = get_locint_r(); // source
     1830                arg1 = get_locint_r(); // count
     1831                arg = get_locint_r(); // first Buffer
     1832#if defined(_FOS_)
     1833                trade = (double*) myalloc1(arg1*2);
     1834                MPI_Recv( trade , 2*arg1, MPI_DOUBLE , arg2, res , MPI_COMM_WORLD, &status_MPI);
     1835
     1836                for (mpi_i=0; mpi_i < arg1; mpi_i++) {
     1837                    rp_T[arg + mpi_i] = trade[2*mpi_i];
     1838                    rp_A[arg + mpi_i] += trade[2*mpi_i + 1];
     1839                }
     1840                myfree1(trade);
     1841#endif
     1842#if defined(_FOV_)
     1843                trade = (double*) myalloc1(arg1*(1+p));
     1844                MPI_Recv( trade , (1+p)*arg1, MPI_DOUBLE , arg2, res , MPI_COMM_WORLD, &status_MPI);
     1845
     1846                for ( mpi_i=0; mpi_i < arg1 ; mpi_i++ )
     1847                    rp_T[arg+mpi_i] = trade[mpi_i];
     1848
     1849                n = arg1;
     1850                for ( mpi_i=0; mpi_i < arg1 ; mpi_i++ )
     1851                    FOR_0_LE_l_LT_p
     1852                    {
     1853                        rpp_A[arg+mpi_i][l] += trade[n];
     1854                        n++;
     1855                    }
     1856
     1857                myfree1(trade);
     1858#endif
     1859                   break;
     1860                /*--------------------------------------------------------------------------*/
     1861            case barrier_op:
     1862                MPI_Barrier(MPI_COMM_WORLD);
     1863                break;
     1864                /*--------------------------------------------------------------------------*/
     1865            case broadcast:
     1866                id = get_locint_r(); // process id
     1867                root = get_locint_r(); // root
     1868                count = get_locint_r(); // count
     1869                loc_recv = get_locint_r(); // Recv Buffer
     1870                loc_send = get_locint_r(); // Send Buffer
     1871#if defined(_FOS_)
     1872                trade = (double*) myalloc1(count*2);
     1873                if (id == root)
     1874                   rec_buf = (double*) myalloc1(2*count);
     1875                else
     1876                   rec_buf = NULL;
     1877                for (mpi_i=0; mpi_i < count; mpi_i++) {
     1878                    trade[2*mpi_i] = rp_T[loc_send + mpi_i] ;
     1879                    trade[2*mpi_i+1] = rp_A[loc_send + mpi_i];
     1880                    rp_A[loc_send + mpi_i]=0;
     1881                    if (id != root)
     1882                       ADOLC_GET_TAYLOR(loc_send+mpi_i);
     1883                }
     1884                MPI_Reduce( trade , rec_buf ,2*count, MPI_DOUBLE , MPI_SUM , root, MPI_COMM_WORLD);
     1885                if (id == root){
     1886                   for (mpi_i=0; mpi_i < count; mpi_i++) {
     1887                       rp_T[loc_send + mpi_i] = rec_buf[2*mpi_i];
     1888                       rp_A[loc_send + mpi_i] += rec_buf[2*mpi_i + 1];
     1889                   }
     1890                   myfree1(rec_buf);
     1891                }
     1892                myfree1(trade);
     1893#endif
     1894#if defined(_FOV_)
     1895                trade = (double*) myalloc1(count*(1+p));
     1896                if (id==root)
     1897                   rec_buf = (double*) myalloc1((1+p)*count);
     1898                else
     1899                   rec_buf = NULL;
     1900                for (mpi_i=0; mpi_i < count; mpi_i++) {
     1901                    trade[(p+1)*mpi_i] = rp_T[loc_send + mpi_i];
     1902                    FOR_0_LE_l_LT_p{
     1903                       trade[(p+1)*mpi_i+1+l] = rpp_A[loc_send + mpi_i][l];
     1904                       rpp_A[loc_send + mpi_i][l] = 0;
     1905                    }
     1906                    if(id != root)
     1907                        ADOLC_GET_TAYLOR(loc_send+mpi_i);
     1908                }
     1909                MPI_Reduce( trade , rec_buf ,(1+p)*count, MPI_DOUBLE , MPI_SUM , root, MPI_COMM_WORLD);
     1910                if (id == root){
     1911                   for (mpi_i=0; mpi_i < count; mpi_i++) {
     1912                       rp_T[loc_send + mpi_i] = rec_buf[(p+1)*mpi_i];
     1913                       FOR_0_LE_l_LT_p
     1914                          rpp_A[loc_send + mpi_i][l] = rec_buf[(p+1)*mpi_i + 1+l];
     1915                   }
     1916                   myfree1(rec_buf);
     1917                }
     1918                myfree1(trade);
     1919#endif
     1920                break;
     1921            case reduce:
     1922                arg = get_locint_r(); // Operation
     1923                id = get_locint_r(); // process id
     1924                root = get_locint_r(); // root
     1925                count = get_locint_r(); // count
     1926                loc_recv = get_locint_r(); // Receive Buffer
     1927                loc_send = get_locint_r(); // Send Buffer
     1928#if defined(_FOS_)
     1929                trade = (double*) myalloc1(count*2);
     1930
     1931               if(id == root)
     1932                for (mpi_i=0; mpi_i < count; mpi_i++) {
     1933                    trade[2*mpi_i] = rp_T[loc_send + mpi_i] ;
     1934                    trade[2*mpi_i+1] = rp_A[loc_send + mpi_i];
     1935                    rp_A[loc_send + mpi_i]=0;
     1936                    ADOLC_GET_TAYLOR(loc_send+mpi_i);
     1937                }
     1938                MPI_Bcast( trade ,2*count, MPI_DOUBLE , root, MPI_COMM_WORLD);
     1939                for (mpi_i=0; mpi_i < count; mpi_i++) {
     1940                    rp_T[loc_recv + mpi_i] = trade[2*mpi_i];
     1941                    rp_A[loc_recv + mpi_i] += trade[2*mpi_i + 1];
     1942                }
     1943                myfree1(trade);
     1944#endif
     1945#if defined(_FOV_)
     1946                trade = (double*) myalloc1(count*(1+p));
     1947                if (id == root){
     1948                   for (mpi_i=0; mpi_i < count; mpi_i++) {
     1949                       trade[(p+1)*mpi_i] = rp_T[loc_send + mpi_i];
     1950                       FOR_0_LE_l_LT_p {
     1951                          trade[(p+1)*mpi_i+1+l] = rpp_A[loc_send + mpi_i][l];
     1952                          rpp_A[loc_send + mpi_i][l] = 0;
     1953                       }
     1954                       ADOLC_GET_TAYLOR(loc_send+mpi_i);
     1955                   }
     1956                }
     1957                MPI_Bcast( trade, (1+p)*count, MPI_DOUBLE, root, MPI_COMM_WORLD);
     1958                for (mpi_i=0; mpi_i < count; mpi_i++) {
     1959                    rp_T[loc_recv + mpi_i] = trade[(p+1)*mpi_i];
     1960                    FOR_0_LE_l_LT_p
     1961                       rpp_A[loc_recv + mpi_i][l] += trade[(p+1)*mpi_i + 1+l];
     1962                    }
     1963                myfree1(trade);
     1964#endif
     1965                break;
     1966                /*--------------------------------------------------------------------------*/
     1967#endif
     1968                /*--------------------------------------------------------------------------*/
    17751969            default:                                                   /* default */
    17761970                /*             Die here, we screwed up     */
  • branches/MPI/ADOL-C/src/ho_rev.c

    r106 r240  
    1212 
    1313 Copyright (c) Andrea Walther, Andreas Griewank, Andreas Kowarz,
    14                Hristo Mitev, Sebastian Schlenkrich, Jean Utke, Olaf Vogel
     14               Hristo Mitev, Sebastian Schlenkrich, Jean Utke, Olaf Vogel,
     15               Benjamin Letschert
    1516 
    1617 This file is part of ADOL-C. This software is provided as open source.
     
    273274#include <math.h>
    274275
     276#if defined(HAVE_MPI)
     277#include <adolc/adolc_mpi.h>
     278#endif /* ADOLC_Parallel */
     279
    275280#if defined(ADOLC_DEBUG)
    276281#include <string.h>
     
    293298                double  **results)   /* matrix of coefficient vectors */
    294299{ int i, j, rc;
    295     double** L = myalloc2(depen,degre+1);
     300        double** L = NULL;
     301        /* if depen==indep==0 then tnum is not main process */
     302        if((depen!=0) && (indep != 0)) L = myalloc2(depen,degre+1);
    296303    for ( i = 0; i < depen; ++i ) {
    297304        L[i][0] = lagrange[i];
     
    300307    }
    301308    rc = hos_ti_reverse(tnum,depen,indep,degre,L,results);
    302     myfree2(L);
     309        if((depen!=0) && (indep != 0)) myfree2(L);
    303310    return rc;
    304311}
     
    585592#endif /* ADOLC_DEBUG */
    586593
    587     while (operation != start_of_tape) {
     594#if defined(HAVE_MPI)
     595        MPI_Status status_MPI;
     596        double *trade, *rec_buf;
     597        int mpi_i, id, root, count, loc_recv, loc_send;
     598     MPI_Op mpi_op;
     599#endif /* is used by Parallelisation */
     600
     601    while (operation != start_of_tape) {
    588602        /* Switch statement to execute the operations in Reverse */
    589603        switch (operation) {
     
    20722086                        AARG1_INC = 0.0;
    20732087                }
    2074                
     2088
    20752089                for (j=arg1;j<=arg2;j++)
    20762090                    GET_TAYL(j,k,p)
     
    20782092                break;
    20792093
     2094                /*--------------------------------------------------------------------------*/
     2095
     2096#if defined(HAVE_MPI)
     2097               case receive_data:       // MPI-Send
     2098                   res  = get_locint_r(); // tag
     2099                   arg2 = get_locint_r(); // dest
     2100                arg1 = get_locint_r(); // count
     2101                      arg  = get_locint_r(); // first Buffer
     2102
     2103#if defined(_HOS_)
     2104                trade = (double*) myalloc1((k+k1)*arg1);
     2105                /* writing Taylor- and Adjointbuffer in one double array */
     2106
     2107                for (mpi_i=0 , i = arg; mpi_i< arg1 ;mpi_i++, i++){
     2108                    FOR_0_LE_l_LT_pk
     2109                         trade[mpi_i*(k+k1) + l] = rpp_T[i][l];
     2110
     2111                    FOR_0_LE_l_LT_pk1 {
     2112                         trade[mpi_i*(k+k1) + k + l] = rpp_A[i][l];
     2113                         rpp_A[i][l] = 0;
     2114                    }
     2115                }
     2116
     2117               MPI_Send(trade,(k+k1)*arg1,MPI_DOUBLE,arg2,res,MPI_COMM_WORLD);
     2118               myfree1(trade);
     2119
     2120         /* loading saved Values of Adjoint- and Taylorbuffer */
     2121                for (mpi_i=0; mpi_i<arg1; mpi_i++)
     2122                    GET_TAYL(arg+mpi_i,k,p);
     2123#endif
     2124#if defined(_HOV_)
     2125                trade = (double*) myalloc1((k+pk1)*arg1);
     2126                /* writing Taylor- and Adjointbuffer in one double array */
     2127                l= 0;
     2128                for (mpi_i=0; mpi_i< arg1;mpi_i++)
     2129                    for (i=0; i < k ; i++ )
     2130                        trade[mpi_i*k+i] = rpp_T[arg+mpi_i][i];
     2131
     2132                l =  arg1*k;
     2133                for (mpi_i=0; mpi_i< arg1;mpi_i++){
     2134                    for (i=0; i < pk1 ; i++){
     2135                        trade[l + i] = rpp_A[arg+mpi_i][i];
     2136                        rpp_A[arg+mpi_i][i] =0;
     2137                    }
     2138                    l += pk1;
     2139                }
     2140
     2141               /* loading saved Values of Adjoint- and Taylorbuffer */
     2142               for (mpi_i=0; mpi_i<arg1; mpi_i++)
     2143                   GET_TAYL(arg+mpi_i,k,p)
     2144
     2145                MPI_Send(trade,(k+pk1)*arg1,MPI_DOUBLE,arg2,res,MPI_COMM_WORLD);
     2146                myfree1(trade);
     2147#endif
     2148                break;
     2149
     2150                /*--------------------------------------------------------------------------*/
     2151            case send_data:     // MPI-Send-Befehl
     2152                   res = get_locint_r(); // tag
     2153                      arg2 = get_locint_r(); // source
     2154                      arg1 = get_locint_r(); // count
     2155                      arg = get_locint_r(); // first Buffer
     2156#if defined(_HOS_)
     2157                trade = (double*) myalloc1(arg1*(k+k1));
     2158                MPI_Recv( trade , (k+k1)*arg1, MPI_DOUBLE , arg2, res , MPI_COMM_WORLD, &status_MPI);
     2159
     2160                for (mpi_i=0 , i = arg; mpi_i< arg1 ;mpi_i++, i++){
     2161                    FOR_0_LE_l_LT_pk
     2162                         rpp_T[i][l] = trade[mpi_i*(k+k1) + l];
     2163
     2164                    FOR_0_LE_l_LT_pk1 {
     2165                         rpp_A[i][l] += trade[mpi_i*(k+k1) + k + l] ;
     2166                    }
     2167                }
     2168
     2169                   myfree1(trade);
     2170#endif
     2171#if defined(_HOV_)
     2172                trade = (double*) myalloc1(arg1*(k+pk1));
     2173                MPI_Recv( trade , (k+pk1)*arg1, MPI_DOUBLE , arg2, res , MPI_COMM_WORLD, &status_MPI);
     2174
     2175                for (mpi_i=0; mpi_i<arg1; mpi_i++)
     2176                    for (i=0; i < k ; i++ )
     2177                        rpp_T[arg+mpi_i][i] = trade[mpi_i*k +i];
     2178
     2179                l= arg1*k;
     2180                for (mpi_i=0; mpi_i<arg1; mpi_i++ )
     2181                    for (i=0; i < pk1 ; i++){
     2182                        rpp_A[arg+mpi_i][i] += trade[l];
     2183                        l++;
     2184                    }
     2185
     2186                myfree1(trade);
     2187#endif
     2188                   break;
     2189
     2190                /*--------------------------------------------------------------------------*/
     2191            case barrier_op:
     2192                MPI_Barrier(MPI_COMM_WORLD);
     2193                break;
     2194            case broadcast:
     2195                id = get_locint_r(); // process id
     2196                root = get_locint_r(); // root
     2197                count = get_locint_r(); // count
     2198                loc_recv = get_locint_r();
     2199                loc_send = get_locint_r(); // first Buffer
     2200#if defined(_HOS_)
     2201                trade = (double*) myalloc1(count*(k+k1));
     2202                for (mpi_i=0, i = loc_send; mpi_i< count; mpi_i++, i++){
     2203                    for( l=0; l < k ; l++)
     2204                        trade[mpi_i*(k+k1) +l] = rpp_T[i][l];
     2205                    for( l=0; l < k1 ; l++) {
     2206                      trade[mpi_i*(k+k1) + k + l] = rpp_A[i][l];
     2207                        rpp_A[i][l] = 0;
     2208                    }
     2209                }
     2210            /* loading saved Values of Adjoint- and Taylorbuffer */
     2211                if (id == root) {
     2212                   rec_buf = myalloc1(count*(k+k1));
     2213                }else{
     2214                   rec_buf = NULL;
     2215                }
     2216                for(mpi_i=0; mpi_i<count; mpi_i++)
     2217                   GET_TAYL(loc_send+mpi_i,k,p);
     2218
     2219//                 MPI_Gather(trade,count*(k+k1),MPI_DOUBLE,rec_buf, count*(k+k1), MPI_DOUBLE, root, MPI_COMM_WORLD);
     2220                MPI_Reduce( trade , rec_buf ,(k+k1)*count, MPI_DOUBLE , MPI_SUM , root, MPI_COMM_WORLD);
     2221                myfree1(trade);
     2222                if (id == root){
     2223                   for(j=1; j < process_count ; j++){
     2224                      for(mpi_i=0 ; mpi_i< count ;mpi_i++){
     2225                         for( l=0; l < k ; l++){
     2226                            rpp_T[loc_send+mpi_i][l] = rec_buf[i];
     2227                            i++;
     2228                         }
     2229                         for( l=0; l < k1 ; l++){
     2230                            rpp_A[loc_send+mpi_i][l] = rec_buf[i];
     2231                            i++;
     2232                         }
     2233                      }
     2234                   }
     2235                   myfree1(rec_buf);
     2236                }
     2237#endif
     2238#if defined(_HOV_)
     2239                trade = (double*) myalloc1(count*(k+pk1));
     2240
     2241                for (mpi_i=0 , i = loc_send; mpi_i< count ;mpi_i++, i++){
     2242                    for( l=0; l < k ; l++)
     2243                         trade[mpi_i*(k+pk1) +l] = rpp_T[i][l];
     2244
     2245                    for( l=0; l < pk1 ; l++) {
     2246                         trade[mpi_i*(k+pk1) + k + l] = rpp_A[i][l];
     2247//                          rpp_A[i][l] = 0;
     2248                    }
     2249                }
     2250         /* loading saved Values of Adjoint- and Taylorbuffer */
     2251//                 for (mpi_i=0; mpi_i<count; mpi_i++)
     2252//                     GET_TAYL(loc_recv+mpi_i,k,p);
     2253
     2254                if (id == root)
     2255                   rec_buf = myalloc1(count*(k+pk1));
     2256                else rec_buf = NULL;
     2257
     2258                MPI_Reduce( trade , rec_buf ,(k+pk1)*count, MPI_DOUBLE , MPI_SUM , root, MPI_COMM_WORLD);
     2259                myfree1(trade);
     2260                if (id == root){
     2261                   for (mpi_i=0 , i = loc_send; mpi_i< count ;mpi_i++, i++){
     2262                       for( l=0; l < k ; l++)
     2263                            rpp_T[i+mpi_i][l] = rec_buf[mpi_i*(k+pk1) +l];
     2264                       for( l=0; l < pk1 ; l++)
     2265                            rpp_A[i+mpi_i][l] = rec_buf[mpi_i*(k+pk1) + k + l];
     2266                   }
     2267                   myfree1(rec_buf);
     2268                }
     2269#endif
     2270                break;
     2271
     2272            case reduce:
     2273                mpi_op = get_locint_r(); // Operation
     2274                id = get_locint_r(); // process id
     2275                root = get_locint_r(); // root
     2276                count = get_locint_r(); // count
     2277                loc_recv = get_locint_r(); // first Buffer
     2278#if defined(_HOS_)
     2279
     2280                trade = (double*) myalloc1(count*(k+k1));
     2281                if (id == root){
     2282                   i=0;
     2283                   for (mpi_i=0 ; mpi_i< count ;mpi_i++ ){
     2284                      for( l=0; l < k ; l++){
     2285                         trade[i] = rpp_T[mpi_i+loc_recv][l];
     2286                         i++;
     2287                      }
     2288                      for( l=0; l < k1 ;l++) {
     2289                         trade[i] = rpp_A[mpi_i+loc_recv][l];
     2290                         rpp_A[mpi_i+loc_recv][l] = 0;
     2291                         i++;
     2292                      }
     2293                      GET_TAYL(loc_recv+mpi_i,k,p);
     2294                   }
     2295                }
     2296                MPI_Bcast( trade ,(k+k1)*count, MPI_DOUBLE , root, MPI_COMM_WORLD);
     2297
     2298                if ( !(id == root )){
     2299                   i=0;
     2300                   for (mpi_i=0; mpi_i< count ;mpi_i++){
     2301                       for( l=0; l < k ; l++){
     2302                          rpp_T[loc_recv+mpi_i][l] = trade[i];
     2303                          i++;
     2304                       }
     2305                       for( l=0; l < k1 ; l++){
     2306                          rpp_A[loc_recv+mpi_i][l] += trade[i];
     2307                          i++;
     2308                       }
     2309                   }
     2310                }
     2311                myfree1(trade);
     2312#endif
     2313#if defined(_HOV_)
     2314                trade = (double*) myalloc1(count*(k+pk1));
     2315
     2316                if (id == root){
     2317                   i=0;
     2318                   for (mpi_i=0 ; mpi_i< count ;mpi_i++){
     2319                      for( l=0; l < k ; l++){
     2320                         trade[i] = rpp_T[mpi_i+loc_recv][l];
     2321                         i++;
     2322                      }
     2323                      for( l=0; l < pk1 ; l++) {
     2324                         trade[i] = rpp_A[loc_recv+mpi_i][l];
     2325                         rpp_A[i][l] = 0;
     2326                         i++;
     2327                      }
     2328                      GET_TAYL(loc_recv+mpi_i,k,p);
     2329                   }
     2330                }
     2331
     2332                MPI_Bcast( trade,(k+pk1)*count, MPI_DOUBLE , root, MPI_COMM_WORLD);
     2333
     2334                if (id != root){
     2335                   i=0;
     2336                   for (mpi_i=0 ; mpi_i< count ; mpi_i++){
     2337                       for( l=0; l < k ; l++){
     2338                          rpp_T[mpi_i+loc_recv][l] = trade[i];
     2339                          i++;
     2340                       }
     2341                       for( l=0; l < pk1 ; l++) {
     2342                          rpp_A[mpi_i+loc_recv][l] += trade[i];
     2343                          i++;
     2344                       }
     2345                   }
     2346                }
     2347                myfree1(trade);
     2348#endif
     2349                break;
     2350#endif
    20802351                /*--------------------------------------------------------------------------*/
    20812352            default:                                                   /* default */
     
    20892360        } /* endswitch */
    20902361
    2091         /* Get the next operation */   
     2362        /* Get the next operation */
    20922363        operation=get_op_r();
    20932364#if defined(ADOLC_DEBUG)
  • branches/MPI/ADOL-C/src/oplate.h

    r106 r240  
    66 
    77 Copyright (c) Andrea Walther, Andreas Griewank, Andreas Kowarz,
    8                Hristo Mitev, Sebastian Schlenkrich, Jean Utke, Olaf Vogel
     8               Hristo Mitev, Sebastian Schlenkrich, Jean Utke, Olaf Vogel,
     9               Benjamin Letschert
    910 
    1011 This file is part of ADOL-C. This software is provided as open source.
     
    8384  floor_op,
    8485  ext_diff,
    85   ignore_me
     86  ignore_me,
     87  send_data=61,
     88  receive_data,
     89  barrier_op,
     90  broadcast,
     91  reduce
    8692};
    8793
  • branches/MPI/ADOL-C/src/sparse/Makefile.am

    r171 r240  
    2626
    2727libsparse_la_SOURCES     = sparse_fo_rev.cpp sparsedrivers.cpp
     28if HAVE_MPI
     29AM_CPPFLAGS += @MPICPPFLAGS@
     30endif
  • branches/MPI/ADOL-C/src/sparse/Makefile.in

    r171 r240  
    3939build_triplet = @build@
    4040host_triplet = @host@
     41@HAVE_MPI_TRUE@am__append_1 = @MPICPPFLAGS@
    4142subdir = ADOL-C/src/sparse
    4243DIST_COMMON = $(libsparseinclude_HEADERS) $(srcdir)/Makefile.am \
     
    140141LD = @LD@
    141142LDFLAGS = @LDFLAGS@
     143LIBMPI = @LIBMPI@
    142144LIBOBJS = @LIBOBJS@
    143145LIBS = @LIBS@
     
    152154MCS = @MCS@
    153155MKDIR_P = @MKDIR_P@
     156MPICPPFLAGS = @MPICPPFLAGS@
     157MPILIBS = @MPILIBS@
    154158NM = @NM@
    155159NMEDIT = @NMEDIT@
     
    235239AM_CFLAGS = @ac_adolc_cflags@ -DADOLC_INTERNAL=1 -DSPARSE=1
    236240AM_CXXFLAGS = @ac_adolc_cxxflags@ -DADOLC_INTERNAL=1 -DSPARSE=1
    237 AM_CPPFLAGS = -I$(top_srcdir)/ADOL-C -I$(top_srcdir)/ADOL-C/src  @COLPACK_CFLAGS@
     241AM_CPPFLAGS = -I$(top_srcdir)/ADOL-C -I$(top_srcdir)/ADOL-C/src \
     242        @COLPACK_CFLAGS@ $(am__append_1)
    238243INCLUDES = -I$(top_builddir)/ADOL-C
    239244MAINTAINERCLEANFILES = Makefile.in *~ *.orig
  • branches/MPI/ADOL-C/src/sparse/sparsedrivers.cpp

    r204 r240  
    44 Revision: $Id$
    55 Contents: "Easy To Use" C++ interfaces of SPARSE package
    6  
    7  Copyright (c) Andrea Walther
    8  
     6
     7 Copyright (c) Andrea Walther, Benjamin Letschert
     8
    99 This file is part of ADOL-C. This software is provided as open source.
    1010 Any use, reproduction, or distribution of the software constitutes
     
    11041104/****************************************************************************/
    11051105/*                                                               THAT'S ALL */
    1106 
     1106#ifdef HAVE_MPI
     1107#include <adolc/adolc_mpi.h>
     1108
     1109int jac_pat(int id, int size, short tag, int depen,int indep, const double *basepoint, unsigned int **crs, int *options ){
     1110     int rc= -1;
     1111     int this_tag = tag*size + id;
     1112
     1113     if (options[0] !=0 ) {
     1114        if (id==0) printf("This operation is not yet implemented.\n");
     1115        return rc;
     1116     }
     1117     if ( id==0)
     1118        jac_pat(this_tag,depen,indep,basepoint,crs,options);
     1119     else{
     1120        if (( options[0] < 0 ) || (options[0] > 1 ))
     1121           options[0] = 0; /* default */
     1122        if (( options[1] < 0 ) || (options[1] > 1 ))
     1123           options[1] = 0; /* default */
     1124        if (( options[2] < -1 ) || (options[2] > 2 ))
     1125           options[2] = 0; /* default */
     1126
     1127        if (options[1] == 1)
     1128           rc = indopro_forward_tight(this_tag, 0, 0, NULL, crs);
     1129        else
     1130           rc = indopro_forward_safe(this_tag, 0, 0, NULL, crs);
     1131     }
     1132     return(rc);
     1133}
     1134
     1135int sparse_jac(int id,int size, short tag, int depen, int indep, int repeat, const double* basepoint, int *nnz, unsigned int **rind, unsigned int **cind, double **values, int *options)
     1136{
     1137#ifdef HAVE_LIBCOLPACK
     1138     int this_tag = size*tag +id;
     1139     int rc =-3, tmp;
     1140     bool forward, tight;
     1141
     1142     if (options[0] != 0){
     1143        if (id==0)
     1144           fprintf(DIAG_OUT,"ADOL-C error: Propagation of bit pattern not yet implemented.\n");
     1145        exit(-1);
     1146     }
     1147     if (id==0){
     1148        int i;
     1149        unsigned int j;
     1150        SparseJacInfos sJinfos;
     1151        int dummy;
     1152        BipartiteGraphPartialColoringInterface *g;
     1153        TapeInfos *tapeInfos;
     1154        JacobianRecovery1D *jr1d;
     1155        JacobianRecovery1D jr1d_loc;
     1156
     1157        ADOLC_OPENMP_THREAD_NUMBER;
     1158        ADOLC_OPENMP_GET_THREAD_NUMBER;
     1159
     1160        if (repeat == 0) {
     1161           if (( options[0] < 0 ) || (options[0] > 1 ))
     1162              options[0] = 0; /* default */
     1163           if (( options[1] < 0 ) || (options[1] > 1 ))
     1164              options[1] = 0; /* default */
     1165           if (( options[2] < -1 ) || (options[2] > 2 ))
     1166              options[2] = 0; /* default */
     1167           if (( options[3] < 0 ) || (options[3] > 1 ))
     1168              options[3] = 0; /* default */
     1169
     1170           sJinfos.JP = (unsigned int **) malloc(depen*sizeof(unsigned int *));
     1171           rc = jac_pat(this_tag, depen, indep, basepoint, sJinfos.JP, options);
     1172
     1173           if (rc < 0) {
     1174              fprintf(DIAG_OUT,"ADOL-C error in parallel sparse_jac() computing jac_pat()\n");
     1175              exit(rc);
     1176           }
     1177
     1178           sJinfos.depen = depen;
     1179           sJinfos.nnz_in = depen;
     1180           sJinfos.nnz_in = 0;
     1181           for (i=0;i<depen;i++) {
     1182               for (j=1;j<=sJinfos.JP[i][0];j++)
     1183                   sJinfos.nnz_in++;
     1184           }
     1185
     1186           *nnz = sJinfos.nnz_in;
     1187
     1188           if (options[2] == -1){
     1189              (*rind) = new unsigned int[*nnz];
     1190              (*cind) = new unsigned int[*nnz];
     1191              unsigned int index = 0;
     1192              for (i=0;i<depen;i++)
     1193                  for (j=1;j<=sJinfos.JP[i][0];j++){
     1194                      (*rind)[index] = i;
     1195                      (*cind)[index++] = sJinfos.JP[i][j];
     1196                  }
     1197           }
     1198
     1199           /* sJinfos.Seed is memory managed by ColPack and will be deleted
     1200            * along with g. We only keep it in sJinfos for the repeat != 0 case */
     1201
     1202           g = new BipartiteGraphPartialColoringInterface(SRC_MEM_ADOLC, sJinfos.JP, depen, indep);
     1203           jr1d = new JacobianRecovery1D;
     1204
     1205           if (options[3] == 1) {
     1206              g->GenerateSeedJacobian(&(sJinfos.Seed), &(sJinfos.seed_rows),&(sJinfos.seed_clms),  "SMALLEST_LAST","ROW_PARTIAL_DISTANCE_TWO");
     1207              sJinfos.seed_clms = indep;
     1208           }
     1209           else
     1210           {
     1211              g->GenerateSeedJacobian(&(sJinfos.Seed), &(sJinfos.seed_rows),
     1212                                &(sJinfos.seed_clms), "SMALLEST_LAST","COLUMN_PARTIAL_DISTANCE_TWO");
     1213              sJinfos.seed_rows = depen;
     1214           }
     1215
     1216           sJinfos.B = myalloc2(sJinfos.seed_rows,sJinfos.seed_clms);
     1217           sJinfos.y = myalloc1(depen);
     1218
     1219           sJinfos.g = (void *) g;
     1220           sJinfos.jr1d = (void *) jr1d;
     1221           setTapeInfoJacSparse(this_tag, sJinfos);
     1222           tapeInfos=getTapeInfos(this_tag);
     1223           memcpy(&ADOLC_CURRENT_TAPE_INFOS, tapeInfos, sizeof(TapeInfos));
     1224        }
     1225        else
     1226        {
     1227           tapeInfos=getTapeInfos(this_tag);
     1228           memcpy(&ADOLC_CURRENT_TAPE_INFOS, tapeInfos, sizeof(TapeInfos));
     1229           sJinfos.depen    = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sJinfos.depen;
     1230           sJinfos.nnz_in    = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sJinfos.nnz_in;
     1231           sJinfos.JP        = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sJinfos.JP;
     1232           sJinfos.B         = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sJinfos.B;
     1233           sJinfos.y         = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sJinfos.y;
     1234           sJinfos.Seed      = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sJinfos.Seed;
     1235           sJinfos.seed_rows = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sJinfos.seed_rows;
     1236           sJinfos.seed_clms = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sJinfos.seed_clms;
     1237           g = (BipartiteGraphPartialColoringInterface *)ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sJinfos.g;
     1238           jr1d = (JacobianRecovery1D *)ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sJinfos.jr1d;
     1239        }
     1240
     1241        if (sJinfos.nnz_in != *nnz) {
     1242           fprintf(DIAG_OUT," ADOL-C error in parallel sparse_jac():"
     1243               " Number of nonzeros not consistent,"
     1244               " repeat call with repeat = 0 \n");
     1245           exit(-3);
     1246        }
     1247
     1248        if (options[2] == -1)
     1249           return rc;
     1250
     1251        // send count for depth
     1252        if (options[3] == 1)
     1253           tmp = sJinfos.seed_rows;
     1254        else
     1255           tmp = sJinfos.seed_clms;
     1256
     1257        for(i=1; i < size ; i++)
     1258             MPI_Send(&tmp,1,MPI_INT,i,0,MPI_COMM_WORLD);
     1259        MPI_Barrier(MPI_COMM_WORLD);
     1260
     1261        /* compute jacobian times matrix product */
     1262        if (options[3] == 1){
     1263           rc = zos_forward(this_tag,depen,indep,1,basepoint,sJinfos.y);
     1264           if (rc < 0)
     1265              return rc;
     1266           rc = fov_reverse(this_tag,depen,indep,sJinfos.seed_rows,sJinfos.Seed,sJinfos.B);
     1267        }
     1268        else
     1269        {
     1270           rc = fov_forward(this_tag, depen, indep, sJinfos.seed_clms, basepoint, sJinfos.Seed, sJinfos.y, sJinfos.B);
     1271        }
     1272
     1273        /* recover compressed Jacobian => ColPack library */
     1274
     1275        if (*values != NULL && *rind != NULL && *cind != NULL) {
     1276        // everything is preallocated, we assume correctly
     1277        // call usermem versions
     1278           if (options[3] == 1)
     1279              jr1d->RecoverD2Row_CoordinateFormat_usermem(g, sJinfos.B, sJinfos.JP, rind, cind, values);
     1280           else
     1281              jr1d->RecoverD2Cln_CoordinateFormat_usermem(g, sJinfos.B, sJinfos.JP, rind, cind, values);
     1282        } else {
     1283      // at least one of rind cind values is not allocated, deallocate others
     1284      // and call unmanaged versions
     1285           if (*values != NULL)
     1286              free(*values);
     1287           if (*rind != NULL)
     1288              free(*rind);
     1289           if (*cind != NULL)
     1290              free(*cind);
     1291           if (options[3] == 1)
     1292              jr1d->RecoverD2Row_CoordinateFormat_unmanaged(g, sJinfos.B, sJinfos.JP, rind, cind, values);
     1293           else
     1294              jr1d->RecoverD2Cln_CoordinateFormat_unmanaged(g, sJinfos.B, sJinfos.JP, rind, cind, values);
     1295        }
     1296     } // end of id == 0
     1297     else {
     1298          if (repeat == 0) {
     1299             if (( options[0] < 0 ) || (options[0] > 1 ))
     1300                options[0] = 0; /* default */
     1301             if (( options[1] < 0 ) || (options[1] > 1 ))
     1302                options[1] = 0; /* default */
     1303             if (( options[2] < -1 ) || (options[2] > 2 ))
     1304                options[2] = 0; /* default */
     1305             if (( options[3] < 0 ) || (options[3] > 1 ))
     1306                options[3] = 0; /* default */
     1307
     1308             rc = jac_pat(id,size,tag,depen,indep,NULL,NULL,options);
     1309
     1310             if (rc < 0) {
     1311                  fprintf(DIAG_OUT," ADOL-C error in parallel sparse_jac() computing jac_pat()\n");
     1312                  exit(rc);
     1313             }
     1314          } // end of sparse_jac doings
     1315
     1316          if (options[2] == -1)
     1317                  return rc;
     1318
     1319          MPI_Status status;
     1320          MPI_Recv(&tmp,1,MPI_INT,0,0,MPI_COMM_WORLD, &status);
     1321          MPI_Barrier(MPI_COMM_WORLD);
     1322
     1323
     1324          if (options[3] == 1){
     1325             rc = zos_forward(this_tag,0,0,1,NULL,NULL);
     1326             if (rc < 0) {
     1327                   fprintf(DIAG_OUT,"ADOL-C error in parallel sparse_jac() computing zos_forward()\n");
     1328                   exit(rc);
     1329             }
     1330             rc = fov_reverse(this_tag,0,0,tmp,NULL,NULL);
     1331          }
     1332          else {
     1333             rc = fov_forward(this_tag, 0,0, tmp, NULL, NULL, NULL, NULL);
     1334          }
     1335     } // end repeat == 0
     1336
     1337     return rc;
     1338#else
     1339    fprintf(DIAG_OUT, "ADOL-C error: function %s can only be used if linked with ColPack\n", __FUNCTION__);
     1340    exit(-1);
     1341#endif
     1342}
     1343
     1344int hess_pat(
     1345     int id,
     1346     int size,
     1347     short          tag,        /* tape identification                        */
     1348     int            indep,      /* number of independent variables            */
     1349     const double  *basepoint,  /* independant variable values                */
     1350     unsigned int **crs,
     1351     /* returned compressed row block-index storage                         */
     1352     int          option
     1353     /* control option
     1354        option : test the computational graph control flow
     1355                               0 - safe mode (default)
     1356                               1 - tight mode                              */
     1357
     1358) {
     1359     int this_tag = size*tag + id;
     1360     int rc= -1;
     1361     int i;
     1362
     1363     if (id == 0) {
     1364        if (crs == NULL) {
     1365           fprintf(DIAG_OUT,"ADOL-C user error in parallel hess_pat(...) : "
     1366                "parameter crs may not be NULL !\n");
     1367           exit(-1);
     1368        }else
     1369           for (i=0; i<indep; i++)
     1370               crs[i] = NULL;
     1371
     1372        if (( option < 0 ) || (option > 2 ))
     1373           option = 0;   /* default */
     1374
     1375        if (option == 1)
     1376           rc = nonl_ind_forward_tight(this_tag, 1, indep, basepoint, crs);
     1377        else
     1378           rc = nonl_ind_forward_safe(this_tag, 1, indep, basepoint, crs);
     1379     } // end of id == 0
     1380     else {
     1381        if (( option < 0 ) || (option > 2 ))
     1382           option = 0;   /* default */
     1383        if (option == 1)
     1384           rc = nonl_ind_forward_tight(this_tag, 0, 0, NULL, crs);
     1385        else
     1386           rc = nonl_ind_forward_safe(this_tag, 0, 0, NULL, crs);
     1387     }
     1388     return rc;
     1389}
     1390
     1391int sparse_hess(
     1392     int id,
     1393     int size,
     1394     short          tag,        /* tape identification                     */
     1395     int            indep,      /* number of independent variables         */
     1396     int            repeat,     /* indicated repeated call with same seed  */
     1397     const double  *basepoint,  /* independant variable values             */
     1398     int           *nnz,        /* number of nonzeros                      */
     1399     unsigned int **rind,       /* row index                               */
     1400     unsigned int **cind,       /* column index                            */
     1401     double       **values,     /* non-zero values                         */
     1402     int           *options
     1403     /* control options
     1404                    options[0] :test the computational graph control flow
     1405                               0 - safe mode (default)
     1406                               1 - tight mode
     1407                    options[1] : way of recovery
     1408                               0 - indirect recovery
     1409                               1 - direct recovery                         */
     1410) {
     1411#ifdef HAVE_LIBCOLPACK
     1412     int i, l, tmp;
     1413     int this_tag = size*tag + id;
     1414     unsigned int j;
     1415     SparseHessInfos sHinfos;
     1416     double **Seed;
     1417     int dummy;
     1418     double y;
     1419     int ret_val=-1;
     1420     GraphColoringInterface *g;
     1421     TapeInfos *tapeInfos;
     1422     double *v, *w, **X, yt, lag=1;
     1423     HessianRecovery *hr;
     1424
     1425     ADOLC_OPENMP_THREAD_NUMBER;
     1426     ADOLC_OPENMP_GET_THREAD_NUMBER;
     1427
     1428     /* Generate sparsity pattern, determine nnz, allocate memory */
     1429     if( id ==0){
     1430        if (repeat <= 0) {
     1431           if (( options[0] < 0 ) || (options[0] > 1 ))
     1432              options[0] = 0; /* default */
     1433           if (( options[1] < 0 ) || (options[1] > 1 ))
     1434              options[1] = 0; /* default */
     1435
     1436           if (repeat == 0) {
     1437              sHinfos.HP    = (unsigned int **) malloc(indep*sizeof(unsigned int *));
     1438              /* generate sparsity pattern */
     1439              ret_val = hess_pat(id,size,tag, indep, basepoint, sHinfos.HP, options[0]);
     1440              if (ret_val < 0) {
     1441                 fprintf(DIAG_OUT," ADOL-C error in parallel sparse_hess() \n");
     1442                 exit(ret_val);
     1443              }
     1444           }
     1445           else {
     1446              tapeInfos=getTapeInfos(this_tag);
     1447              memcpy(&ADOLC_CURRENT_TAPE_INFOS, tapeInfos, sizeof(TapeInfos));
     1448              if (indep != ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.indep) {
     1449                 fprintf(DIAG_OUT,"ADOL-C Error: wrong number of independents stored in parallel hessian pattern.\n");
     1450                 exit(-1);
     1451              }
     1452              deepcopy_HP(&sHinfos.HP,ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.HP,indep);
     1453           }
     1454
     1455           sHinfos.indep = indep;
     1456           sHinfos.nnz_in = 0;
     1457
     1458           for (i=0;i<indep;i++) {
     1459               for (j=1;j<=sHinfos.HP[i][0];j++)
     1460                   if ((int) sHinfos.HP[i][j] >= i)
     1461                      sHinfos.nnz_in++;
     1462           }
     1463
     1464           *nnz = sHinfos.nnz_in;
     1465
     1466           /* compute seed matrix => ColPack library */
     1467
     1468           Seed = NULL;
     1469
     1470           g = new GraphColoringInterface(SRC_MEM_ADOLC, sHinfos.HP, indep);
     1471           hr = new HessianRecovery;
     1472
     1473           if (options[1] == 0)
     1474              g->GenerateSeedHessian(&Seed, &dummy, &sHinfos.p,"SMALLEST_LAST","ACYCLIC_FOR_INDIRECT_RECOVERY");
     1475           else
     1476              g->GenerateSeedHessian(&Seed, &dummy, &sHinfos.p,"SMALLEST_LAST","STAR");
     1477
     1478           sHinfos.Hcomp = myalloc2(indep,sHinfos.p);
     1479           sHinfos.Xppp = myalloc3(indep,sHinfos.p,1);
     1480
     1481           for (i=0; i<indep; i++)
     1482               for (l=0;l<sHinfos.p;l++)
     1483                   sHinfos.Xppp[i][l][0] = Seed[i][l];
     1484
     1485           /* Seed will be freed by ColPack when g is freed */
     1486           Seed = NULL;
     1487
     1488           sHinfos.Yppp = myalloc3(1,sHinfos.p,1);
     1489           sHinfos.Zppp = myalloc3(sHinfos.p,indep,2);
     1490           sHinfos.Upp = myalloc2(1,2);
     1491           sHinfos.Upp[0][0] = 1;
     1492           sHinfos.Upp[0][1] = 0;
     1493           sHinfos.g = (void *) g;
     1494           sHinfos.hr = (void *) hr;
     1495
     1496           setTapeInfoHessSparse(this_tag, sHinfos);
     1497
     1498           tapeInfos=getTapeInfos(this_tag);
     1499           memcpy(&ADOLC_CURRENT_TAPE_INFOS, tapeInfos, sizeof(TapeInfos));
     1500        } // end of repeat == 0
     1501        else
     1502        {
     1503           tapeInfos=getTapeInfos(this_tag);
     1504           memcpy(&ADOLC_CURRENT_TAPE_INFOS, tapeInfos, sizeof(TapeInfos));
     1505           sHinfos.nnz_in = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.nnz_in;
     1506           sHinfos.HP     = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.HP;
     1507           sHinfos.Hcomp  = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.Hcomp;
     1508           sHinfos.Xppp   = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.Xppp;
     1509           sHinfos.Yppp   = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.Yppp;
     1510           sHinfos.Zppp   = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.Zppp;
     1511           sHinfos.Upp    = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.Upp;
     1512           sHinfos.p      = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.p;
     1513           g = (GraphColoringInterface *)ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.g;
     1514           hr = (HessianRecovery *)ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.hr;
     1515        }
     1516
     1517        if (sHinfos.Upp == NULL) {
     1518           fprintf(DIAG_OUT," ADOL-C error in parallel sparse_hess():\n First call with repeat = 0 \n");
     1519           exit(-3);
     1520        }
     1521
     1522        if (sHinfos.nnz_in != *nnz) {
     1523           fprintf(DIAG_OUT," ADOL-C error in parallel sparse_hess():\n Number of nonzeros not consistent,\n new call with repeat = 0 \n");
     1524           exit(-3);
     1525        }
     1526
     1527        if (repeat == -1)
     1528           return ret_val;
     1529
     1530        v    = (double*) malloc(indep*sizeof(double));
     1531        w    = (double*) malloc(indep*sizeof(double));
     1532        X = myalloc2(indep,2);
     1533
     1534        tmp = sHinfos.p;
     1535        MPI_Bcast(&tmp,1, MPI_INT,0,MPI_COMM_WORLD);
     1536
     1537        for (i = 0; i < sHinfos.p; ++i) {
     1538            for (l = 0; l < indep; ++l)
     1539                v[l] = sHinfos.Xppp[l][i][0];
     1540
     1541            ret_val = fos_forward(this_tag, 1, indep, 2, basepoint, v, &y, &yt);
     1542            MINDEC(ret_val, hos_reverse(this_tag, 1, indep, 1, &lag, X));
     1543            for (l = 0; l < indep; ++l)
     1544                sHinfos.Hcomp[l][i] = X[l][1];
     1545        }
     1546
     1547        myfree1(v);
     1548        myfree1(w);
     1549        myfree2(X);
     1550
     1551        if (*values != NULL && *rind != NULL && *cind != NULL) {
     1552           // everything is preallocated, we assume correctly
     1553           // call usermem versions
     1554           if (options[1] == 0)
     1555              hr->IndirectRecover_CoordinateFormat_usermem(g, sHinfos.Hcomp, sHinfos.HP, rind, cind, values);
     1556           else
     1557              hr->DirectRecover_CoordinateFormat_usermem(g, sHinfos.Hcomp, sHinfos.HP, rind, cind, values);
     1558        } else {
     1559           // at least one of rind cind values is not allocated, deallocate others
     1560           // and call unmanaged versions
     1561          if (*values != NULL)
     1562             free(*values);
     1563          if (*rind != NULL)
     1564             free(*rind);
     1565          if (*cind != NULL)
     1566             free(*cind);
     1567
     1568          if (options[1] == 0)
     1569             hr->IndirectRecover_CoordinateFormat_unmanaged(g, sHinfos.Hcomp, sHinfos.HP, rind, cind, values);
     1570          else
     1571             hr->DirectRecover_CoordinateFormat_unmanaged(g, sHinfos.Hcomp, sHinfos.HP, rind, cind, values);
     1572        }
     1573     } // ende id == 0
     1574     else {
     1575        if (repeat <= 0) {
     1576           if (( options[0] < 0 ) || (options[0] > 1 ))
     1577              options[0] = 0; /* default */
     1578           if (( options[1] < 0 ) || (options[1] > 1 ))
     1579              options[1] = 0; /* default */
     1580
     1581           if (repeat == 0){
     1582              /* generate sparsity pattern */
     1583              ret_val = hess_pat(id,size,tag, indep, basepoint, NULL, options[0]);
     1584              if (ret_val < 0) {
     1585                 fprintf(DIAG_OUT," ADOL-C error in parallel sparse_hess() \n");
     1586                 exit(ret_val);
     1587              }
     1588           }
     1589        }
     1590
     1591        if (repeat == -1)
     1592           return ret_val;
     1593
     1594        MPI_Bcast(&tmp,1, MPI_INT,0,MPI_COMM_WORLD);
     1595
     1596        for (i = 0; i < tmp; ++i) {
     1597            ret_val = fos_forward(this_tag, 0, 0, 2, NULL, NULL, NULL, NULL);
     1598            MINDEC(ret_val, hos_reverse(this_tag, 0, 0, 1, &lag, NULL ) );
     1599        }
     1600     } // end id else
     1601     return ret_val;
     1602#else
     1603    fprintf(DIAG_OUT, "ADOL-C error: function %s can only be used if linked with ColPack\n", __FUNCTION__);
     1604    exit(-1);
     1605#endif
     1606}
     1607#endif
  • branches/MPI/ADOL-C/src/sparse/sparsedrivers.h

    r176 r240  
    44 Revision: $Id$
    55 Contents: This file containts some "Easy To Use" interfaces of sparse package.
    6  
    7  Copyright (c) Andrea Walther
     6
     7 Copyright (c) Andrea Walther, Benjamin Letschert
    88
    99 This file is part of ADOL-C. This software is provided as open source.
     
    105105END_C_DECLS
    106106
     107
     108/*************************************************************************************************/
     109/*****                          Now parallel ColPack-Drivers                                 *****/
     110#if defined(__cplusplus) && defined(HAVE_MPI)
     111int jac_pat(
     112    int id, int size, short tag, int depen, int indep, const double *basepoint, unsigned int **crs, int *options);
     113
     114int hess_pat
     115( int id, int size, short tag, int indep, const double *basepoint, unsigned int **crs, int option);
     116
     117int sparse_jac(
     118    int id,int size ,short tag, int depen, int indep, int repeat, const double *basepoint, int *nnz, unsigned int **rind,
     119    unsigned int **cind, double **values,int *options );
     120
     121int sparse_hess
     122( int id, int size ,short tag ,int indep,int repeat, const double *basepoint, int *nnz ,unsigned int **rind, unsigned int **cind, double **values, int *options);
     123
    107124#endif
     125
     126#endif
  • branches/MPI/ADOL-C/src/tapedoc/Makefile.in

    r171 r240  
    140140LD = @LD@
    141141LDFLAGS = @LDFLAGS@
     142LIBMPI = @LIBMPI@
    142143LIBOBJS = @LIBOBJS@
    143144LIBS = @LIBS@
     
    152153MCS = @MCS@
    153154MKDIR_P = @MKDIR_P@
     155MPICPPFLAGS = @MPICPPFLAGS@
     156MPILIBS = @MPILIBS@
    154157NM = @NM@
    155158NMEDIT = @NMEDIT@
  • branches/MPI/ADOL-C/src/tapedoc/tapedoc.c

    r106 r240  
    77 
    88 Copyright (c) Andrea Walther, Andreas Griewank, Andreas Kowarz,
    9                Hristo Mitev, Sebastian Schlenkrich, Jean Utke, Olaf Vogel
     9               Hristo Mitev, Sebastian Schlenkrich, Jean Utke, Olaf Vogel,
     10               Benjamin Letschert
    1011
    1112 This file is part of ADOL-C. This software is provided as open source.
     
    105106                       "ceil op",
    106107                       "floor op",
    107                        "extern fctn"
    108                        "ignore_me"
     108                       "extern fctn",
     109                       "ignore_me",
     110                       "send data",
     111                       "receive data",
     112                       "barrier Op"
    109113                    };
    110114
     
    139143    fprintf(fp,"\\begin{tabular}{|r|r|r|l|r|r|r|r||r|r||r|r|r|r|} \\hline \n");
    140144    fprintf(fp," & & code & op & loc & loc & loc & loc & double & double & value & value & value & value \\\\ \\hline \n");
    141     fprintf(fp," %i & start of tape & & & & & & & & & &  \\\\ \\hline \n",opcode);
     145    fprintf(fp," & & %i & start of tape & & & & & & & & & &  \\\\ \\hline \n",opcode);
    142146#else
    143147    fprintf(fp,"\\begin{tabular}{|r|r|r|l|r|r|r|r||r|r|} \\hline \n");
     
    11831187                filewrite(operation, 3, loc_a, val_a, 0, cst_d);
    11841188                break;
    1185 
    1186                 /*--------------------------------------------------------------------------*/
    1187             default:                                                   /* default */
     1189                /*--------------------------------------------------------------------------*/
     1190#if defined(HAVE_MPI)       
     1191        case send_data:
     1192                arg1 = get_locint_f();
     1193                arg2 = get_locint_f();
     1194                res  = get_locint_f();
     1195                loc_a[0]=get_locint_f();
     1196                loc_a[0]=arg1;
     1197                loc_a[1]=arg2;
     1198                loc_a[2]=res;
     1199#ifdef computenumbers
     1200                val_a[0]=dp_T0[arg1];
     1201                dp_T0[res] = erf(dp_T0[arg1]);
     1202                ADOLC_OPENMP_RESTORE_THREAD_NUMBER;
     1203                val_a[1]=dp_T0[arg2];
     1204                val_a[2]=dp_T0[res];
     1205#endif
     1206                filewrite(operation,3,loc_a,val_a,0,cst_d);
     1207                break;
     1208        case receive_data:
     1209                loc_a[0]=get_locint_f(); // adouble location
     1210                loc_a[1]=get_locint_f(); // target
     1211                loc_a[2]=get_locint_f(); // destination
     1212                res = get_locint_f();
     1213                filewrite(operation, 3, loc_a, val_a, 0, cst_d);
     1214                break;
     1215        case barrier_op:
     1216                ++op_cnt;
     1217                --rev_op_cnt;
     1218                fprintf(fp,"%i & %i & %i & ",op_cnt, rev_op_cnt, barrier_op);
     1219               
     1220    /* write opcode name if available */
     1221                res=0;
     1222                while (a[barrier_op][res]) {
     1223                        fprintf(fp,"%c",a[barrier_op][res]);
     1224                        res++;
     1225                }
     1226               
     1227    /* write locations (max 4) right-justified */
     1228                fprintf(fp," & & & & & ");
     1229               
     1230#ifdef computenumbers
     1231                fprintf(fp," & & & & & \\\\ \\hline \n");
     1232#else
     1233                fprintf(fp," &  \\\\ \\hline \n");
     1234#endif
     1235                break;
     1236#endif
     1237                /*--------------------------------------------------------------------------*/
     1238        default:                                                   /* default */
    11881239                /* Die here, we screwed up */
    11891240                fprintf(DIAG_OUT,"ADOL-C error: Fatal error in tape_doc for op %d\n",
  • branches/MPI/ADOL-C/src/uni5_for.c

    r221 r240  
    4343#endif /* ADOLC_DEBUG */
    4444
     45#if defined(HAVE_MPI)
     46#include <adolc/adolc_mpi.h>
     47#endif
    4548
    4649/****************************************************************************/
     
    128131void combine_2_index_domains(int res, int arg1, int arg2, locint **ind_dom);
    129132void merge_3_index_domains(int res, int arg1, int arg2, locint **ind_dom);
     133#if defined(HAVE_MPI)
     134void combine_index_domain_received_data(int res, int count, locint **ind_dom, locint *trade);
     135#endif
    130136
    131137#define NUMNNZ 20
     
    153159void extend_nonlinearity_domain_binary
    154160(int arg1, int arg2, locint **ind_dom, locint **nonl_dom);
     161
     162#if defined(HAVE_MPI)
     163void extend_nonlinearity_domain_combine_received_trade
     164(int arg1, int counts, locint **nonl_dom, locint *trade);
     165#endif
    155166
    156167
     
    910921        exit (-1);
    911922    }
     923#if defined(HAVE_MPI)
     924     double *trade, *rec_buf;
     925     MPI_Status status_MPI;
     926     int mpi_i , loc_send,loc_recv;
     927     MPI_Op mpi_op;
     928     int myid,root, count, id;
     929     MPI_Comm_rank(MPI_COMM_WORLD, &id);
     930#if defined(_NONLIND_)
     931     locint *tmp_element;
     932#endif
     933#if defined(_INDO_)
     934     int *trade_loc, *rec_buf_loc;
     935     int *counts, *tmp_counts;
     936     int anz;
     937#endif
     938#if defined(_INT_FOR_)
     939     unsigned long int *up_mpi;
     940#endif
     941#endif
    912942
    913943
     
    9771007    max_ind_dom = ADOLC_CURRENT_TAPE_INFOS.stats[NUM_MAX_LIVES];
    9781008#if defined(_NONLIND_)
    979 
     1009#if defined(HAVE_MPI)
     1010    int s_r_indep =indcheck;
     1011    if (mpi_initialized) {
     1012       MPI_Comm_rank(MPI_COMM_WORLD, &myid);
     1013       MPI_Bcast(&s_r_indep,1,MPI_INT,0,MPI_COMM_WORLD);
     1014
     1015       nonl_dom = (locint**) malloc(sizeof(locint*) * s_r_indep);
     1016       for(i=0;i<s_r_indep;i++){
     1017           nonl_dom[i] = (locint*) malloc(sizeof(locint)*(NUMNNZ+2));
     1018           nonl_dom[i][0] = 0;
     1019           nonl_dom[i][1] = NUMNNZ;
     1020       }
     1021    }
     1022    else {
     1023       nonl_dom = (locint**) malloc(sizeof(locint*) * s_r_indep);
     1024       for(i=0;i<indcheck;i++){
     1025          nonl_dom[i] = (locint*) malloc(sizeof(locint)*(NUMNNZ+2));
     1026          nonl_dom[i][0]=0;
     1027          nonl_dom[i][1]=NUMNNZ;
     1028       }
     1029    }
     1030#else
    9801031    nonl_dom = (locint**) malloc(sizeof(locint*) * indcheck);
    9811032    for(i=0;i<indcheck;i++){
     
    9841035          nonl_dom[i][1]=NUMNNZ;
    9851036       }
     1037#endif
    9861038#endif
    9871039
     
    36383690#endif
    36393691                /*--------------------------------------------------------------------------*/
     3692#if defined(HAVE_MPI)
     3693      case send_data:   // MPI-Send-Befehl
     3694              arg = get_locint_f(); // first Buffer
     3695              arg1 = get_locint_f(); // count
     3696              arg2 = get_locint_f(); // dest
     3697              res = get_locint_f(); // tag
     3698#if !defined(_NTIGHT_)
     3699          // sending dp_t0
     3700          trade = (double*) myalloc1( arg1 );
     3701          for (mpi_i=0; mpi_i< arg1; mpi_i++)
     3702                    trade[mpi_i] = dp_T0[arg+mpi_i];
     3703          MPI_Send( trade , arg1, MPI_DOUBLE , arg2, res , MPI_COMM_WORLD);
     3704          myfree1(trade);
     3705#endif    /* END NOT _NTIGHT_ */
     3706#if defined(_FOS_)
     3707           trade = (double*) myalloc1(arg1);
     3708           for (mpi_i=0; mpi_i< arg1; mpi_i++) {
     3709                trade[mpi_i]=dp_T[arg+mpi_i];
     3710           }
     3711           MPI_Send( trade , arg1, MPI_DOUBLE , arg2, res , MPI_COMM_WORLD);
     3712           myfree1(trade);
     3713#endif /* END FOS */
     3714#if defined(_FOV_)
     3715           trade = (double*) myalloc1(p*arg1);
     3716           for (mpi_i=0; mpi_i< arg1; mpi_i++) {
     3717                for(i=0;i<p;i++)
     3718                     trade[p*mpi_i+i] = dpp_T[arg+mpi_i][i];
     3719           }
     3720           MPI_Send( trade , arg1*p, MPI_DOUBLE , arg2, res , MPI_COMM_WORLD);
     3721           myfree1(trade);
     3722#endif /* END FOV */
     3723#if defined(_HOS_)
     3724           trade = (double*) myalloc1(arg1 * k);
     3725           /*  Receiving double Values by MPI and try to save Taylorbuffer before overwriting */
     3726           for (mpi_i=0; mpi_i< arg1; mpi_i++)
     3727               for (i=0; i<k; i++)
     3728                   trade[k*mpi_i + i] = dpp_T[arg+mpi_i][i];
     3729           MPI_Send( trade , arg1*k, MPI_DOUBLE , arg2, res , MPI_COMM_WORLD);
     3730           myfree1(trade);
     3731#endif /* END HOS */
     3732#if defined(_HOV_)
     3733           trade = (double*) myalloc1(arg1 * p*k);
     3734           /*  Receiving double Values by MPI and try to save Taylorbuffer before overwriting */
     3735           for (mpi_i=0; mpi_i< arg1; mpi_i++)
     3736               for (i=0; i<p*k; i++)
     3737                   trade[p*k*mpi_i + i] = dpp_T[arg+mpi_i][i];
     3738           MPI_Send( trade , arg1*p*k, MPI_DOUBLE , arg2, res , MPI_COMM_WORLD);
     3739           myfree1(trade);
     3740#endif /* END HOV */
     3741#if defined(_INDO_)
     3742           // getting information about count of entries
     3743           counts = (int*) malloc( arg1*sizeof(int) );
     3744           anz=0;
     3745           for (mpi_i=0; mpi_i< arg1; mpi_i++){
     3746               counts[mpi_i] = (int) ind_dom[arg+mpi_i][0];
     3747               anz += counts[mpi_i];
     3748           }
     3749           MPI_Send( counts , arg1 , MPI_INT , arg2, res , MPI_COMM_WORLD);
     3750
     3751           // sending index domains
     3752           if (anz > 0 ){
     3753              trade_loc = (int*) malloc( anz*sizeof(int) );
     3754              l =0;
     3755              for (mpi_i=0; mpi_i< arg1; mpi_i++){
     3756                  for(i=2;i < ind_dom[arg+mpi_i][0]+2 ;i++ ){
     3757                       trade_loc[l] = (int) ind_dom[arg+mpi_i][i];
     3758                       l++;
     3759                  }
     3760              }
     3761              MPI_Send( trade_loc , anz , MPI_INT , arg2, res , MPI_COMM_WORLD);
     3762              free(trade_loc);
     3763           }
     3764           free(counts);
     3765#endif
     3766#if defined(_NONLIND_)
     3767           counts = (int*) malloc(s_r_indep*sizeof(int));
     3768           anz=0;
     3769           // Send information about counts of ind_dom and nonl_dom
     3770           for (mpi_i=0; mpi_i< s_r_indep; mpi_i++){
     3771               counts[mpi_i] = (int) nonl_dom[mpi_i][0];
     3772               anz += counts[mpi_i];
     3773               }
     3774
     3775           MPI_Send( counts , s_r_indep , MPI_INT , arg2, res , MPI_COMM_WORLD);
     3776
     3777           // sending index domains
     3778           if (anz >0 ){
     3779              trade_loc = (int*) malloc(anz*sizeof(int));
     3780              l =0;
     3781              for (mpi_i=0; mpi_i < s_r_indep ; mpi_i++ )
     3782                  for (i=2; i < counts[mpi_i]+2 ; i++ ){
     3783                      trade_loc[l] = nonl_dom[mpi_i][i];
     3784                      l++;
     3785                  }
     3786              MPI_Send( trade_loc , anz , MPI_INT , arg2, res , MPI_COMM_WORLD);
     3787              free( trade_loc);
     3788           }
     3789           free( counts);
     3790#endif    // end _NONLIND_
     3791              break;
     3792                /*--------------------------------------------------------------------------*/
     3793      case receive_data: // MPI-Receive
     3794           arg =get_locint_f(); // Location
     3795           arg1 = get_locint_f(); // count
     3796           arg2 = get_locint_f(); // source
     3797           res = get_locint_f(); // tag
     3798#if !defined(_NTIGHT_)
     3799          // receiving values for dp_T0
     3800          trade = (double*) myalloc1( arg1 );
     3801          MPI_Recv( trade , arg1, MPI_DOUBLE , arg2, res , MPI_COMM_WORLD, &status_MPI);
     3802          for (mpi_i =0; mpi_i < arg1; mpi_i++){
     3803              IF_KEEP_WRITE_TAYLOR(arg+mpi_i,keep,k,p)
     3804              dp_T0[arg+mpi_i] = trade[mpi_i];
     3805          }
     3806          myfree1(trade);
     3807#endif /* END NOT _NTIGHT_ */
     3808#if defined(_FOS_)
     3809           trade = (double*) myalloc1(arg1);
     3810           MPI_Recv( trade , arg1, MPI_DOUBLE , arg2, res , MPI_COMM_WORLD, &status_MPI);
     3811           /*  Receiving double Values by MPI and try to save Taylorbuffer before overwriting */
     3812           for (mpi_i=0; mpi_i< arg1; mpi_i++){
     3813                dp_T[arg+mpi_i] = trade[mpi_i];
     3814                }
     3815           myfree1(trade);
     3816#endif
     3817#if defined(_FOV_)
     3818           trade = (double*) myalloc1(arg1*p);
     3819           MPI_Recv( trade , p*arg1, MPI_DOUBLE , arg2, res , MPI_COMM_WORLD, &status_MPI);
     3820           /*  Receiving double Values by MPI and try to save Taylorbuffer before overwriting */
     3821           for (mpi_i=0; mpi_i< arg1; mpi_i++) {
     3822                for(i=0;i<p;i++)
     3823                     dpp_T[arg+mpi_i][i] = trade[p*mpi_i+i];
     3824           }
     3825           myfree1(trade);
     3826#endif
     3827#if defined(_HOS_)
     3828           trade = (double*) myalloc1(arg1 * k);
     3829           MPI_Recv( trade , k*arg1, MPI_DOUBLE , arg2, res , MPI_COMM_WORLD, &status_MPI);
     3830           /*  Receiving double Values by MPI and try to save Taylorbuffer before overwriting */
     3831           for (mpi_i=0; mpi_i< arg1; mpi_i++) {
     3832               for(i=0; i < k ; i++ )
     3833                dpp_T[arg+mpi_i][i] = trade[k*mpi_i+i];
     3834           }
     3835           myfree1(trade);
     3836#endif
     3837#if defined(_HOV_)
     3838           trade = (double*) myalloc1(arg1 * p*k);
     3839           MPI_Recv( trade , p*k*arg1, MPI_DOUBLE , arg2, res , MPI_COMM_WORLD, &status_MPI);
     3840           /*  Receiving double Values by MPI and try to save Taylorbuffer before overwriting */
     3841           for (mpi_i=0; mpi_i< arg1; mpi_i++) {
     3842               for(i=0; i < p*k ; i++ )
     3843                dpp_T[arg+mpi_i][i] = trade[p*k*mpi_i+i];
     3844           }
     3845           myfree1(trade);
     3846#endif
     3847#if defined(_INDO_)
     3848           // getting information about count of entries
     3849           counts = ( int*) malloc( arg1*sizeof(int) );
     3850           MPI_Recv( counts , arg1, MPI_INT , arg2, res , MPI_COMM_WORLD, &status_MPI);
     3851
     3852           anz =0;
     3853           for (mpi_i=0; mpi_i< arg1; mpi_i++) {
     3854               anz += counts[mpi_i];
     3855           }
     3856           if ( anz > 0){
     3857              trade_loc = (int*) malloc( anz*sizeof(int) );
     3858              MPI_Recv( trade_loc , anz , MPI_INT , arg2, res , MPI_COMM_WORLD, &status_MPI);
     3859
     3860              // combine each index domain ...
     3861              l = 0;
     3862              for(mpi_i=0; mpi_i < arg1; mpi_i++){
     3863                   combine_index_domain_received_data(arg+mpi_i, counts[mpi_i], ind_dom, &trade_loc[l] );
     3864                   l += counts[mpi_i];
     3865              }
     3866              free(trade_loc);
     3867           }
     3868           free( counts);
     3869#endif
     3870#if defined(_NONLIND_)
     3871           counts = ( int*) malloc( s_r_indep*sizeof(int) );
     3872           MPI_Recv( counts , s_r_indep, MPI_INT , arg2, res , MPI_COMM_WORLD, &status_MPI);
     3873           anz =0;
     3874           for (mpi_i=0; mpi_i< s_r_indep; mpi_i++){
     3875               anz +=  (int) counts[mpi_i];
     3876           }
     3877           if (anz > 0) {
     3878              trade_loc = (int*) calloc( anz,sizeof(int) );
     3879              MPI_Recv( trade_loc , anz , MPI_INT , arg2, res , MPI_COMM_WORLD, &status_MPI);
     3880
     3881              // combine each index domain ...
     3882              l = 0;
     3883              for (mpi_i=0; mpi_i < s_r_indep; mpi_i++){
     3884                  // nonl_dom settings
     3885                  extend_nonlinearity_domain_combine_received_trade(mpi_i, counts[mpi_i], nonl_dom, &trade_loc[l] );
     3886                  l += counts[mpi_i];
     3887              }
     3888
     3889              free( trade_loc);
     3890           }
     3891           free( counts);
     3892#endif    // end _NONLIND_
     3893              break;
     3894      case barrier_op:
     3895              MPI_Barrier(MPI_COMM_WORLD);
     3896              break;
     3897      case broadcast:
     3898           loc_send = get_locint_f(); // Send Location
     3899           loc_recv = get_locint_f(); // Receive Location
     3900           count = get_locint_f(); // count
     3901           root = get_locint_f(); // root
     3902           myid = get_locint_f(); // process id
     3903#if !defined(_NTIGHT_)
     3904           // receiving values for dp_T0
     3905           trade = (double*) myalloc1( count );
     3906           if (myid == root){
     3907              for(mpi_i =0; mpi_i < count ; mpi_i++)
     3908                 trade[mpi_i] = dp_T0[loc_send+mpi_i];
     3909            }
     3910           MPI_Bcast(trade,count, MPI_DOUBLE, root, MPI_COMM_WORLD);
     3911           for( mpi_i =0; mpi_i < count; mpi_i++){
     3912               IF_KEEP_WRITE_TAYLOR(loc_recv+mpi_i,keep,k,p)
     3913               dp_T0[loc_recv+mpi_i] = trade[mpi_i];
     3914           }
     3915           myfree1(trade);
     3916#endif /* END NOT _NTIGHT_ */
     3917#if defined(_FOS_)
     3918           trade = (double*) myalloc1( count );
     3919           if (myid ==root){
     3920               for(mpi_i =0; mpi_i < count; mpi_i++){
     3921                 trade[mpi_i] = dp_T[loc_send+mpi_i];
     3922              }
     3923           }
     3924           MPI_Bcast(trade,count, MPI_DOUBLE, root, MPI_COMM_WORLD);
     3925           if ( myid != root){
     3926              for( mpi_i =0; mpi_i < count; mpi_i++)
     3927                 dp_T[loc_recv+mpi_i] = trade[mpi_i];
     3928           }
     3929           myfree1(trade);
     3930#endif
     3931#if defined(_FOV_)
     3932           trade = (double*) myalloc1( count*p);
     3933           if (myid ==root){
     3934              for(mpi_i =0; mpi_i < count; mpi_i++)
     3935                 for(i=0; i<p; i++)
     3936                    trade[p*mpi_i+i] = dpp_T[loc_recv+mpi_i][i];
     3937           }
     3938           MPI_Bcast(trade,count*p, MPI_DOUBLE, root, MPI_COMM_WORLD);
     3939           if ( myid != root){
     3940              for(mpi_i =0; mpi_i < count; mpi_i++)
     3941                 for(i=0; i<p; i++)
     3942                    dpp_T[loc_recv+mpi_i][i] = trade[p*mpi_i+i];
     3943           }
     3944           myfree1(trade);
     3945#endif
     3946#if defined(_HOS_)
     3947           trade = (double*) myalloc1(count * k);
     3948           if (myid ==root){
     3949             for(mpi_i =0; mpi_i < count; mpi_i++)
     3950                for(i=0; i<k; i++)
     3951                   trade[k*mpi_i+i] = dpp_T[loc_recv+mpi_i][i];
     3952           }
     3953           MPI_Bcast(trade,count*k, MPI_DOUBLE, root, MPI_COMM_WORLD);
     3954           if ( myid != root){
     3955              for(mpi_i =0; mpi_i < count; mpi_i++)
     3956                 for(i=0; i<k; i++)
     3957                    dpp_T[loc_recv+mpi_i][i] = trade[k*mpi_i+i];
     3958           }
     3959           myfree1(trade);
     3960#endif
     3961#if defined(_HOV_)
     3962           trade = (double*) myalloc1(count * p*k);
     3963           if (myid ==root){
     3964              for(mpi_i =0; mpi_i < count; mpi_i++)
     3965                 for(i=0; i<p*k; i++)
     3966                    trade[p*k*mpi_i+i] = dpp_T[loc_recv+mpi_i][i];
     3967           }
     3968           MPI_Bcast(trade,count*p*k, MPI_DOUBLE, root, MPI_COMM_WORLD);
     3969           if ( myid != root){
     3970              for(mpi_i =0; mpi_i < count; mpi_i++)
     3971                 for(i=0; i<p*k; i++)
     3972                    dpp_T[loc_recv+mpi_i][i] = trade[p*k*mpi_i+i];
     3973           }
     3974           myfree1(trade);
     3975#endif
     3976#if defined(_INDO_)
     3977           // getting information about count of entries
     3978           counts = ( int*) malloc( count*sizeof(int) );
     3979           if (myid ==root){
     3980              for(mpi_i =0; mpi_i < count; mpi_i++)
     3981                 counts[mpi_i] = ind_dom[loc_recv+mpi_i][0];
     3982           }
     3983           MPI_Bcast(counts,count, MPI_INT, root, MPI_COMM_WORLD);
     3984
     3985           anz =0;
     3986           for (mpi_i=0; mpi_i< count; mpi_i++) {
     3987               anz += counts[mpi_i];
     3988           }
     3989           if ( anz > 0){
     3990              trade_loc = (int*) malloc( anz*sizeof(int) );
     3991              if (myid ==root ){
     3992                 l=0;
     3993                 for(mpi_i =0; mpi_i < anz; mpi_i++)
     3994                    for(i=2; i < ind_dom[loc_recv+mpi_i][0]+2; i++){
     3995                       trade_loc[l] = ind_dom[loc_recv+mpi_i][i];
     3996                       l++;
     3997                    }
     3998              }
     3999              MPI_Bcast(trade_loc,anz, MPI_INT, root, MPI_COMM_WORLD);
     4000              if(myid != root){
     4001                 // combine each index domain ...
     4002                 l = 0;
     4003                 for(mpi_i=0; mpi_i < count; mpi_i++){
     4004                    combine_index_domain_received_data(loc_recv+mpi_i, counts[mpi_i], ind_dom, &trade_loc[l] );
     4005                    l += counts[mpi_i];
     4006                 }
     4007              }
     4008              free(trade_loc);
     4009           }
     4010           free(counts);
     4011#endif
     4012#if defined(_NONLIND_)
     4013           counts = ( int*) malloc( s_r_indep*sizeof(int) );
     4014           if (myid ==root){
     4015              for(mpi_i =0; mpi_i < s_r_indep; mpi_i++)
     4016                 counts[mpi_i] = nonl_dom[mpi_i][0];
     4017           }
     4018           MPI_Bcast(counts,s_r_indep, MPI_INT, root, MPI_COMM_WORLD);
     4019
     4020           anz =0;
     4021           for (mpi_i=0; mpi_i< s_r_indep; mpi_i++){
     4022               anz +=  (int) counts[mpi_i];
     4023           }
     4024           if (anz > 0) {
     4025              trade_loc = (int*) calloc( anz,sizeof(int) );
     4026              if (myid == root){
     4027                 l=0;
     4028                 for(mpi_i=0; mpi_i < s_r_indep ; mpi_i++)
     4029                    for(i=2; i < nonl_dom[mpi_i][0]+2 ; i++){
     4030                        trade_loc[l] = nonl_dom[mpi_i][i];
     4031                        l++;
     4032                    }
     4033              }
     4034              MPI_Bcast(trade_loc,anz, MPI_INT, root, MPI_COMM_WORLD);
     4035              if( myid != root){
     4036                 // combine each index domain ...
     4037                 l = 0;
     4038                 for (mpi_i=0; mpi_i < s_r_indep; mpi_i++){
     4039                     // nonl_dom settings
     4040                     extend_nonlinearity_domain_combine_received_trade(mpi_i, counts[mpi_i], nonl_dom, &trade_loc[l]);
     4041                     l += counts[mpi_i];
     4042                 }
     4043              }
     4044              free((char*) trade_loc);
     4045           }
     4046           free((char*) counts);
     4047#endif    // end _NONLIND_
     4048           break;
     4049      case reduce:
     4050           loc_send = get_locint_f(); // Send Location
     4051           loc_recv = get_locint_f(); // Receive Location
     4052           count = get_locint_f(); // count
     4053           root = get_locint_f(); // root
     4054           myid = get_locint_f(); // process id
     4055           mpi_op = get_locint_f(); // MPI_Operation
     4056#if !defined(_NTIGHT_)
     4057           // receiving values for dp_T0
     4058           trade = (double*) myalloc1( count );
     4059           if (myid == root)
     4060              rec_buf = (double*) myalloc1(count);
     4061           else
     4062              rec_buf =NULL;
     4063           for(mpi_i =0; mpi_i < count; mpi_i++)
     4064              trade[mpi_i] = dp_T0[loc_send+mpi_i];
     4065
     4066           MPI_Reduce(trade,rec_buf,count, MPI_DOUBLE, mpi_op, root, MPI_COMM_WORLD);
     4067           if (myid == root){
     4068              for( mpi_i =0; mpi_i < count; mpi_i++){
     4069                 IF_KEEP_WRITE_TAYLOR(loc_recv+mpi_i,keep,k,p)
     4070                 dp_T0[loc_recv+mpi_i] = rec_buf[mpi_i];
     4071              }
     4072              myfree1(rec_buf);
     4073           }
     4074           myfree1(trade);
     4075#endif /* END NOT _NTIGHT_ */
     4076#if defined(_FOS_)
     4077           trade = (double*) myalloc1( count );
     4078           if (myid ==root)
     4079               rec_buf = (double*) myalloc1(count);
     4080           else
     4081               rec_buf = NULL;
     4082           for(mpi_i =0; mpi_i < count; mpi_i++) {
     4083              trade[mpi_i] = dp_T[loc_recv + mpi_i];
     4084           }
     4085           MPI_Reduce(trade,rec_buf,count, MPI_DOUBLE, mpi_op, root, MPI_COMM_WORLD);
     4086           if ( myid == root){
     4087              for( mpi_i =0; mpi_i < count; mpi_i++){
     4088                 dp_T[loc_send+mpi_i] = rec_buf[mpi_i];
     4089               }
     4090              myfree1(rec_buf);
     4091           }
     4092           myfree1(trade);
     4093#endif
     4094#if defined(_FOV_)
     4095           trade = (double*) myalloc1( count*p);
     4096           if (myid == root)
     4097              rec_buf = (double*) myalloc1(count*p);
     4098           else
     4099              rec_buf=NULL;
     4100           for(mpi_i =0; mpi_i < count; mpi_i++)
     4101              for(i=0; i<p; i++)
     4102                 trade[p*mpi_i+i] = dpp_T[loc_recv+mpi_i][i];
     4103
     4104           MPI_Reduce(trade,rec_buf,count*p, MPI_DOUBLE,mpi_op, root, MPI_COMM_WORLD);
     4105           if ( myid == root){
     4106              for(mpi_i =0; mpi_i < count; mpi_i++)
     4107                 for(i=0; i<p; i++)
     4108                    dpp_T[loc_send+mpi_i][i] = rec_buf[p*mpi_i+i];
     4109              myfree1(rec_buf);
     4110           }
     4111           myfree1(trade);
     4112#endif
     4113#if defined(_HOS_)
     4114           trade = (double*) myalloc1(count * k);
     4115           if (myid ==root)
     4116              rec_buf = (double*) myalloc1(count*k);
     4117           else
     4118              rec_buf=NULL;
     4119           for(mpi_i =0; mpi_i < count; mpi_i++)
     4120              for(i=0; i<k; i++)
     4121                 trade[k*mpi_i+i] = dpp_T[loc_recv + mpi_i][i];
     4122
     4123           MPI_Reduce(trade,rec_buf,count*k, MPI_DOUBLE,mpi_op, root, MPI_COMM_WORLD);
     4124           if ( myid == root){
     4125              for(mpi_i =0; mpi_i < count; mpi_i++)
     4126                 for(i=0; i<k; i++)
     4127                    dpp_T[loc_send+mpi_i][i] = rec_buf[k*mpi_i+i];
     4128              myfree1(rec_buf);
     4129           }
     4130           myfree1(trade);
     4131#endif
     4132#if defined(_HOV_)
     4133           trade = (double*) myalloc1(count * p*k);
     4134           if (myid == root)
     4135              rec_buf = (double*) myalloc1(count*p*k);
     4136           else
     4137              rec_buf=NULL;
     4138           for(mpi_i =0; mpi_i < count; mpi_i++)
     4139              for(i=0; i<p*k; i++)
     4140                 trade[p*k*mpi_i+i] = dpp_T[loc_recv+mpi_i][i];
     4141
     4142           MPI_Reduce(trade,rec_buf,count*p*k, MPI_DOUBLE,mpi_op, root, MPI_COMM_WORLD);
     4143           if ( myid == root){
     4144              for(mpi_i =0; mpi_i < count; mpi_i++)
     4145                 for(i=0; i<p*k; i++)
     4146                    dpp_T[loc_send+mpi_i][i] = rec_buf[p*k*mpi_i+i];
     4147              myfree1(rec_buf);
     4148           }
     4149           myfree1(trade);
     4150#endif
     4151#if defined(_INDO_)
     4152           // getting information about count of entries
     4153           counts = ( int*) malloc( count*sizeof(int) );
     4154           if( myid == root)
     4155              tmp_counts = ( int*) malloc( count*sizeof(int)* process_count );
     4156
     4157           for(mpi_i =0; mpi_i < count; mpi_i++){
     4158              counts[mpi_i] = ind_dom[loc_recv+mpi_i][0];
     4159               }
     4160
     4161           MPI_Gather(counts,count, MPI_INT, tmp_counts, count, MPI_INT, root, MPI_COMM_WORLD);
     4162
     4163           if ( myid == root){
     4164              for(i=0; i < count ; i++){
     4165                 for(mpi_i = 1 ; mpi_i < process_count ; mpi_i++)
     4166                     if ( tmp_counts[i] < tmp_counts[i+ mpi_i*count] )
     4167                        tmp_counts[i] = tmp_counts[i+ mpi_i*count];
     4168                 }
     4169              for(i=0; i < count ; i++){
     4170                 counts[i] = tmp_counts[i];
     4171              }
     4172              free(tmp_counts);
     4173          }
     4174           MPI_Bcast(counts ,count, MPI_INT, root, MPI_COMM_WORLD);
     4175
     4176           anz =0;
     4177           for (mpi_i=0; mpi_i< count; mpi_i++) {
     4178               anz += counts[mpi_i];
     4179           }
     4180           // every process has same counts
     4181           if ( anz > 0){
     4182              trade_loc = (int*) malloc( anz*sizeof(int) );
     4183              if (myid == root){
     4184                 rec_buf_loc = (int*) malloc(process_count * anz * sizeof(int));
     4185              } else { rec_buf_loc =NULL; }
     4186
     4187              l=0;
     4188              for(mpi_i =0; mpi_i < count; mpi_i++){
     4189                 for (i=2; i < ind_dom[loc_recv+mpi_i][0]+2; i++){
     4190                    trade_loc[l] = ind_dom[loc_recv+mpi_i][i];
     4191                    l++;
     4192                 }
     4193                 for(i=ind_dom[loc_recv+mpi_i][0]; i < counts[mpi_i] ; i++  ){
     4194                    trade_loc[l] = -10;
     4195                    l++;
     4196                 }
     4197              }
     4198              MPI_Gather(trade_loc,anz, MPI_INT, rec_buf_loc, anz, MPI_INT, root, MPI_COMM_WORLD);
     4199              free( trade_loc );
     4200              if(myid == root){
     4201                 // combine each index domain ...
     4202                 l = anz;
     4203                 for(mpi_op=1; mpi_op < process_count; mpi_op++ ){
     4204
     4205                    for(mpi_i=0; mpi_i < count; mpi_i++){
     4206                       i = 0;
     4207                       while ((rec_buf_loc[l+i] > -1 ) && ( i < counts[mpi_i]) ) {
     4208                              i++;
     4209                            }
     4210                       combine_index_domain_received_data(loc_send+mpi_i, i, ind_dom, &rec_buf_loc[l] );
     4211                       l += counts[mpi_i];
     4212                    }
     4213                 }
     4214                 free(rec_buf_loc);
     4215              }
     4216           }
     4217         free(counts);
     4218#endif
     4219#if defined(_NONLIND_)
     4220           tmp_element = (locint*) malloc( sizeof(locint) );
     4221           counts = ( int*) malloc( sizeof(int) );
     4222           tmp_element[0] = 0;
     4223           for(mpi_i =0; mpi_i < s_r_indep; mpi_i++)
     4224               if( tmp_element[0] < nonl_dom[mpi_i][0] )
     4225                     tmp_element[0] = nonl_dom[mpi_i][0];
     4226           MPI_Allreduce(tmp_element,counts, 1, MPI_INT, MPI_MAX , MPI_COMM_WORLD);
     4227           free(tmp_element);
     4228
     4229           anz = counts[0] * s_r_indep;
     4230
     4231           if (anz > 0) {
     4232              trade_loc = (int*) malloc( anz*sizeof(int) );
     4233              if (myid == root)
     4234                 rec_buf_loc = (int*) malloc(anz*process_count*sizeof(int) );
     4235              else
     4236                 rec_buf_loc = NULL;
     4237              l=0;
     4238              for(mpi_i=0; mpi_i < s_r_indep ; mpi_i++){
     4239                 for(i=0; i < nonl_dom[mpi_i][0] ; i++){
     4240                    trade_loc[l] = nonl_dom[mpi_i][i+2];
     4241                    l++;
     4242                 }
     4243                 for(i= nonl_dom[mpi_i][0]; i < counts[0] ; i++){
     4244                    trade_loc[l] = -10 ;
     4245                    l++;
     4246                 }
     4247              }
     4248
     4249              MPI_Gather(trade_loc,anz, MPI_INT,rec_buf_loc, anz, MPI_INT, root, MPI_COMM_WORLD);
     4250              if( myid == root){
     4251               // combine each index domain ...
     4252                 l = 0;
     4253                 for (i=0; i < process_count ; i++){
     4254                    for (mpi_i=0; mpi_i < s_r_indep; mpi_i++){
     4255                     // nonl_dom settings
     4256                        mpi_op=0;
     4257                        while ((rec_buf_loc[l + mpi_op] > -1) && (mpi_op < counts[0]) ) {
     4258                              mpi_op++;
     4259                        }
     4260                        extend_nonlinearity_domain_combine_received_trade(mpi_i, mpi_op, nonl_dom, &rec_buf_loc[l]);
     4261                        l +=counts[0];
     4262                    }
     4263                 }
     4264                 free(rec_buf_loc);
     4265              }
     4266              free(trade_loc);
     4267           }
     4268           free(counts);
     4269#endif    // end _NONLIND_
     4270           break;
     4271#endif
     4272                /*--------------------------------------------------------------------------*/
    36404273
    36414274            default:                                                   /* default */
     
    37014334
    37024335#if defined(_NONLIND_)
    3703 
     4336#if defined(HAVE_MPI)
     4337    if (mpi_initialized){
     4338       indcheck = s_r_indep;
     4339       if (id == 0 ){
     4340          for ( i=0;i<indcheck;i++) {
     4341              crs[i] = (unsigned int*) malloc( sizeof(unsigned int)*(nonl_dom[i][0]+1));
     4342              crs[i][0] = nonl_dom[i][0];
     4343              for (l=1;l<=crs[i][0];l++) {
     4344                  crs[i][l] = nonl_dom[i][l+1];
     4345              }
     4346              free( nonl_dom[i]);
     4347          }
     4348          free(nonl_dom);
     4349       }
     4350   } else {
     4351       for ( i=0;i<indcheck;i++) {
     4352             for ( i=0;i<indcheck;i++) {
     4353                 crs[i] = (unsigned int*) malloc(sizeof(unsigned int) * (nonl_dom[i][0]+1));
     4354                 crs[i][0] = nonl_dom[i][0];
     4355                 for (l=1;l<=crs[i][0];l++)
     4356                     crs[i][l] = nonl_dom[i][l+1];
     4357             }
     4358        }
     4359     for ( i=0;i<indcheck;i++)
     4360       free( nonl_dom[i]);
     4361     free(nonl_dom);
     4362    }
     4363#else
    37044364    for( i=0; i < indcheck; i++) {
    37054365       crs[i] = (unsigned int*) malloc(sizeof(unsigned int) * (nonl_dom[i][0]+1));
     
    37094369       free(nonl_dom[i]);
    37104370    }
     4371    for ( i=0;i<indcheck;i++)
     4372       free( nonl_dom[i]);
    37114373    free(nonl_dom);
    3712 
     4374#endif
    37134375#endif
    37144376#endif
     
    38294491
    38304492
    3831 
     4493#if defined(HAVE_MPI)
     4494void combine_index_domain_received_data(int res, int count, locint **ind_dom, locint *trade) {
     4495
     4496    int num,num1,i,j,k,l;
     4497    locint *temp_array;
     4498
     4499    if (ind_dom[res][0] == 0){
     4500          if (count > ind_dom[res][1] )
     4501          {
     4502               free(ind_dom[res]);
     4503               ind_dom[res] = (locint *)  malloc(sizeof(locint) *2*(count+2) );
     4504               ind_dom[res][1] = 2*count;
     4505          }
     4506
     4507          for(i=2, j=0;i < count+2;i++,j++)
     4508               ind_dom[res][i] = trade[j];
     4509
     4510          ind_dom[res][0] = count;
     4511    }
     4512    else
     4513    {
     4514     num = ind_dom[res][0];
     4515     temp_array = (locint *)  malloc(sizeof(locint)* num);
     4516     num1 = count;
     4517
     4518     for(i=0;i<num;i++)
     4519         temp_array[i] = ind_dom[res][i+2];
     4520
     4521     if (num1+num > ind_dom[res][1] )
     4522     {
     4523       i = 2*(num1+num);
     4524       free(ind_dom[res]);
     4525       ind_dom[res] = (locint *)  malloc(sizeof(locint) *(i+2));
     4526          ind_dom[res][1] = i;
     4527     }
     4528     i = 0;
     4529     j = 0;
     4530     k = 2;
     4531     while ((i< num) && (j < num1))
     4532         {
     4533           if (temp_array[i] < trade[j])
     4534          {
     4535            ind_dom[res][k] = temp_array[i];
     4536            i++; k++;
     4537          }
     4538           else
     4539           {
     4540            if (temp_array[i] == trade[j])
     4541              {
     4542                ind_dom[res][k] = trade[j];
     4543                i++;j++;k++;
     4544              }
     4545            else
     4546              {
     4547                ind_dom[res][k] = trade[j];
     4548                j++;k++;
     4549              }
     4550          }
     4551         }
     4552       for(l = i;l<num;l++)
     4553       {
     4554           ind_dom[res][k] = temp_array[l];
     4555           k++;
     4556       }
     4557       for(l = j;l<num1;l++)
     4558       {
     4559           ind_dom[res][k] = trade[l];
     4560           k++;
     4561       }
     4562       ind_dom[res][0] = k-2;
     4563       free(temp_array);
     4564    }
     4565
     4566}
     4567#endif
    38324568#endif
    38334569#endif
     
    39194655
    39204656
     4657#if defined(HAVE_MPI)
     4658void extend_nonlinearity_domain_combine_received_trade(int index, int counts, locint **nonl_dom, locint *trade) {
     4659    int num, i,j,k,l,m;
     4660    locint* temp_nonl;
     4661    num = nonl_dom[index][0];
     4662    if ( num == 0) {
     4663          if ( counts > nonl_dom[index][1]){
     4664             free( nonl_dom[index]);
     4665             nonl_dom[index] = (locint*) malloc(sizeof(locint)*(2*counts+2));
     4666             nonl_dom[index][1] = 2*counts;
     4667          }
     4668          for( i=0; i<counts; i++ )
     4669             nonl_dom[index][i+2] = trade[i];
     4670          nonl_dom[index][0] = counts;
     4671       } else { /* merge lists */
     4672          temp_nonl = (locint*) malloc(sizeof(locint)*num);
     4673          for(i=0; i<num; i++ )
     4674             temp_nonl[i] = nonl_dom[index][i+2];
     4675          if ( counts+num > nonl_dom[index][1]){
     4676             free( nonl_dom[index]);
     4677             nonl_dom[index] = (locint*) malloc(sizeof(locint)*2*(counts+num+1));
     4678             nonl_dom[index][1] = 2*(counts+num);
     4679          }
     4680          i = 0; // counts in temp_nonl
     4681          j = 0; // counts in trade
     4682          k = 2; // actually adress in nonl_dom[arg1][...]
     4683          while ((i<num) && (j < counts)) {
     4684             if (trade[j] < temp_nonl[i]) /* < */  {
     4685                nonl_dom[index][k] = trade[j];
     4686                j++; k++;
     4687             } else {
     4688                if (trade[j] == temp_nonl[i])  /* == */ {
     4689                nonl_dom[index][k] = trade[j];
     4690                j++; k++; i++;
     4691                } else /* > */ {
     4692                   nonl_dom[index][k] = temp_nonl[i];
     4693                   i++; k++;
     4694                }
     4695             }
     4696          }
     4697          for(l = j ; l<counts;l++) {
     4698             nonl_dom[index][k] = trade[l];
     4699             k++;
     4700          }
     4701          for (l = i ; l<num;l++) {
     4702             nonl_dom[index][k] = temp_nonl[l];
     4703             k++;
     4704          }
     4705         nonl_dom[index][0] = k-2;
     4706         free((char*) temp_nonl);
     4707       }
     4708}
     4709#endif
    39214710#endif
    39224711#endif
  • branches/MPI/ADOL-C/test/Makefile.in

    r171 r240  
    124124LD = @LD@
    125125LDFLAGS = @LDFLAGS@
     126LIBMPI = @LIBMPI@
    126127LIBOBJS = @LIBOBJS@
    127128LIBS = @LIBS@
     
    136137MCS = @MCS@
    137138MKDIR_P = @MKDIR_P@
     139MPICPPFLAGS = @MPICPPFLAGS@
     140MPILIBS = @MPILIBS@
    138141NM = @NM@
    139142NMEDIT = @NMEDIT@
  • branches/MPI/MSVisualStudio/v10/nosparse/config.h

    r211 r240  
    117117
    118118/* Define to the full name and version of this package. */
    119 #define PACKAGE_STRING "adolc 2.2.0-trunk"
     119#define PACKAGE_STRING "adolc 2.2.0-trunk-mpi"
    120120
    121121/* Define to the one symbol short name of this package. */
     
    126126
    127127/* Define to the version of this package. */
    128 #define PACKAGE_VERSION "2.2.0-trunk"
     128#define PACKAGE_VERSION "2.2.0-trunk-mpi"
    129129
    130130/* The size of `void *', as computed by sizeof. */
     
    141141
    142142/* Version number of package */
    143 #define VERSION "2.2.0-trunk"
     143#define VERSION "2.2.0-trunk-mpi"
    144144
    145145/* Define to empty if `const' does not conform to ANSI C. */
  • branches/MPI/MSVisualStudio/v10/sparse/config.h

    r211 r240  
    117117
    118118/* Define to the full name and version of this package. */
    119 #define PACKAGE_STRING "adolc 2.2.0-trunk"
     119#define PACKAGE_STRING "adolc 2.2.0-trunk-mpi"
    120120
    121121/* Define to the one symbol short name of this package. */
     
    126126
    127127/* Define to the version of this package. */
    128 #define PACKAGE_VERSION "2.2.0-trunk"
     128#define PACKAGE_VERSION "2.2.0-trunk-mpi"
    129129
    130130/* The size of `void *', as computed by sizeof. */
     
    141141
    142142/* Version number of package */
    143 #define VERSION "2.2.0-trunk"
     143#define VERSION "2.2.0-trunk-mpi"
    144144
    145145/* Define to empty if `const' does not conform to ANSI C. */
  • branches/MPI/MSVisualStudio/v10/x64/nosparse/config.h

    r211 r240  
    117117
    118118/* Define to the full name and version of this package. */
    119 #define PACKAGE_STRING "adolc 2.2.0-trunk"
     119#define PACKAGE_STRING "adolc 2.2.0-trunk-mpi"
    120120
    121121/* Define to the one symbol short name of this package. */
     
    126126
    127127/* Define to the version of this package. */
    128 #define PACKAGE_VERSION "2.2.0-trunk"
     128#define PACKAGE_VERSION "2.2.0-trunk-mpi"
    129129
    130130/* The size of `void *', as computed by sizeof. */
     
    141141
    142142/* Version number of package */
    143 #define VERSION "2.2.0-trunk"
     143#define VERSION "2.2.0-trunk-mpi"
    144144
    145145/* Define to empty if `const' does not conform to ANSI C. */
  • branches/MPI/MSVisualStudio/v10/x64/sparse/config.h

    r211 r240  
    117117
    118118/* Define to the full name and version of this package. */
    119 #define PACKAGE_STRING "adolc 2.2.0-trunk"
     119#define PACKAGE_STRING "adolc 2.2.0-trunk-mpi"
    120120
    121121/* Define to the one symbol short name of this package. */
     
    126126
    127127/* Define to the version of this package. */
    128 #define PACKAGE_VERSION "2.2.0-trunk"
     128#define PACKAGE_VERSION "2.2.0-trunk-mpi"
    129129
    130130/* The size of `void *', as computed by sizeof. */
     
    141141
    142142/* Version number of package */
    143 #define VERSION "2.2.0-trunk"
     143#define VERSION "2.2.0-trunk-mpi"
    144144
    145145/* Define to empty if `const' does not conform to ANSI C. */
  • branches/MPI/Makefile.in

    r227 r240  
    165165LD = @LD@
    166166LDFLAGS = @LDFLAGS@
     167LIBMPI = @LIBMPI@
    167168LIBOBJS = @LIBOBJS@
    168169LIBS = @LIBS@
     
    177178MCS = @MCS@
    178179MKDIR_P = @MKDIR_P@
     180MPICPPFLAGS = @MPICPPFLAGS@
     181MPILIBS = @MPILIBS@
    179182NM = @NM@
    180183NMEDIT = @NMEDIT@
  • branches/MPI/adolc.spec

    r211 r240  
    33# norootforbuild
    44
    5 %define packver 2.2.0-trunk
     5%define packver 2.2.0-trunk-mpi
    66
    77Name:           adolc
  • branches/MPI/configure

    r211 r240  
    22# From configure.ac Revision.
    33# Guess values for system-dependent variables and create Makefiles.
    4 # Generated by GNU Autoconf 2.68 for adolc 2.2.0-trunk.
     4# Generated by GNU Autoconf 2.68 for adolc 2.2.0-trunk-mpi.
    55#
    66# Report bugs to <adol-c@list.coin-or.org>.
     
    711711PACKAGE_NAME='adolc'
    712712PACKAGE_TARNAME='adolc'
    713 PACKAGE_VERSION='2.2.0-trunk'
    714 PACKAGE_STRING='adolc 2.2.0-trunk'
     713PACKAGE_VERSION='2.2.0-trunk-mpi'
     714PACKAGE_STRING='adolc 2.2.0-trunk-mpi'
    715715PACKAGE_BUGREPORT='adol-c@list.coin-or.org'
    716716PACKAGE_URL=''
     
    774774DOCEXA_FALSE
    775775DOCEXA_TRUE
     776HAVE_MPI_FALSE
     777HAVE_MPI_TRUE
     778LIBMPI
     779MPILIBS
     780MPICPPFLAGS
    776781COLPACK_LIBS
    777782COLPACK_CFLAGS
     
    920925enable_sparse
    921926with_colpack
     927with_mpi_includedir
     928with_mpi_libdir
    922929enable_docexa
    923930enable_addexa
     
    14831490  # This message is too long to be a string in the A/UX 3.1 sh.
    14841491  cat <<_ACEOF
    1485 \`configure' configures adolc 2.2.0-trunk to adapt to many kinds of systems.
     1492\`configure' configures adolc 2.2.0-trunk-mpi to adapt to many kinds of systems.
    14861493
    14871494Usage: $0 [OPTION]... [VAR=VALUE]...
     
    15531560if test -n "$ac_init_help"; then
    15541561  case $ac_init_help in
    1555      short | recursive ) echo "Configuration of adolc 2.2.0-trunk:";;
     1562     short | recursive ) echo "Configuration of adolc 2.2.0-trunk-mpi:";;
    15561563   esac
    15571564  cat <<\_ACEOF
     
    15981605  --with-colpack          path to the colpack library and headers
    15991606                          [default=${srcdir}/ThirdParty/ColPack]
     1607  --with-mpi-includedir   path to mpi headers [default=autodetect]
     1608  --with-mpi-libdir       path to mpi libs [default=autodetect]
    16001609  --with-openmp-flag=FLAG use FLAG to enable OpenMP at compile time
    16011610                          [default=none]
     
    16821691if $ac_init_version; then
    16831692  cat <<\_ACEOF
    1684 adolc configure 2.2.0-trunk
     1693adolc configure 2.2.0-trunk-mpi
    16851694generated by GNU Autoconf 2.68
    16861695
     
    24952504running configure, to aid debugging if configure makes a mistake.
    24962505
    2497 It was created by adolc $as_me 2.2.0-trunk, which was
     2506It was created by adolc $as_me 2.2.0-trunk-mpi, which was
    24982507generated by GNU Autoconf 2.68.  Invocation command line was
    24992508
     
    33153324# Define the identity of the package.
    33163325 PACKAGE='adolc'
    3317  VERSION='2.2.0-trunk'
     3326 VERSION='2.2.0-trunk-mpi'
    33183327
    33193328
     
    58945903  lt_cv_nm_interface="BSD nm"
    58955904  echo "int some_variable = 0;" > conftest.$ac_ext
    5896   (eval echo "\"\$as_me:5896: $ac_compile\"" >&5)
     5905  (eval echo "\"\$as_me:5905: $ac_compile\"" >&5)
    58975906  (eval "$ac_compile" 2>conftest.err)
    58985907  cat conftest.err >&5
    5899   (eval echo "\"\$as_me:5899: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
     5908  (eval echo "\"\$as_me:5908: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
    59005909  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
    59015910  cat conftest.err >&5
    5902   (eval echo "\"\$as_me:5902: output\"" >&5)
     5911  (eval echo "\"\$as_me:5911: output\"" >&5)
    59035912  cat conftest.out >&5
    59045913  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
     
    70927101*-*-irix6*)
    70937102  # Find out which ABI we are using.
    7094   echo '#line 7094 "configure"' > conftest.$ac_ext
     7103  echo '#line 7103 "configure"' > conftest.$ac_ext
    70957104  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
    70967105  (eval $ac_compile) 2>&5
     
    90059014   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    90069015   -e 's:$: $lt_compiler_flag:'`
    9007    (eval echo "\"\$as_me:9007: $lt_compile\"" >&5)
     9016   (eval echo "\"\$as_me:9016: $lt_compile\"" >&5)
    90089017   (eval "$lt_compile" 2>conftest.err)
    90099018   ac_status=$?
    90109019   cat conftest.err >&5
    9011    echo "$as_me:9011: \$? = $ac_status" >&5
     9020   echo "$as_me:9020: \$? = $ac_status" >&5
    90129021   if (exit $ac_status) && test -s "$ac_outfile"; then
    90139022     # The compiler can only warn and ignore the option if not recognized
     
    93449353   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    93459354   -e 's:$: $lt_compiler_flag:'`
    9346    (eval echo "\"\$as_me:9346: $lt_compile\"" >&5)
     9355   (eval echo "\"\$as_me:9355: $lt_compile\"" >&5)
    93479356   (eval "$lt_compile" 2>conftest.err)
    93489357   ac_status=$?
    93499358   cat conftest.err >&5
    9350    echo "$as_me:9350: \$? = $ac_status" >&5
     9359   echo "$as_me:9359: \$? = $ac_status" >&5
    93519360   if (exit $ac_status) && test -s "$ac_outfile"; then
    93529361     # The compiler can only warn and ignore the option if not recognized
     
    94499458   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    94509459   -e 's:$: $lt_compiler_flag:'`
    9451    (eval echo "\"\$as_me:9451: $lt_compile\"" >&5)
     9460   (eval echo "\"\$as_me:9460: $lt_compile\"" >&5)
    94529461   (eval "$lt_compile" 2>out/conftest.err)
    94539462   ac_status=$?
    94549463   cat out/conftest.err >&5
    9455    echo "$as_me:9455: \$? = $ac_status" >&5
     9464   echo "$as_me:9464: \$? = $ac_status" >&5
    94569465   if (exit $ac_status) && test -s out/conftest2.$ac_objext
    94579466   then
     
    95049513   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    95059514   -e 's:$: $lt_compiler_flag:'`
    9506    (eval echo "\"\$as_me:9506: $lt_compile\"" >&5)
     9515   (eval echo "\"\$as_me:9515: $lt_compile\"" >&5)
    95079516   (eval "$lt_compile" 2>out/conftest.err)
    95089517   ac_status=$?
    95099518   cat out/conftest.err >&5
    9510    echo "$as_me:9510: \$? = $ac_status" >&5
     9519   echo "$as_me:9519: \$? = $ac_status" >&5
    95119520   if (exit $ac_status) && test -s out/conftest2.$ac_objext
    95129521   then
     
    1187211881  lt_status=$lt_dlunknown
    1187311882  cat > conftest.$ac_ext <<_LT_EOF
    11874 #line 11874 "configure"
     11883#line 11883 "configure"
    1187511884#include "confdefs.h"
    1187611885
     
    1196811977  lt_status=$lt_dlunknown
    1196911978  cat > conftest.$ac_ext <<_LT_EOF
    11970 #line 11970 "configure"
     11979#line 11979 "configure"
    1197111980#include "confdefs.h"
    1197211981
     
    1392413933   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    1392513934   -e 's:$: $lt_compiler_flag:'`
    13926    (eval echo "\"\$as_me:13926: $lt_compile\"" >&5)
     13935   (eval echo "\"\$as_me:13935: $lt_compile\"" >&5)
    1392713936   (eval "$lt_compile" 2>conftest.err)
    1392813937   ac_status=$?
    1392913938   cat conftest.err >&5
    13930    echo "$as_me:13930: \$? = $ac_status" >&5
     13939   echo "$as_me:13939: \$? = $ac_status" >&5
    1393113940   if (exit $ac_status) && test -s "$ac_outfile"; then
    1393213941     # The compiler can only warn and ignore the option if not recognized
     
    1402314032   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    1402414033   -e 's:$: $lt_compiler_flag:'`
    14025    (eval echo "\"\$as_me:14025: $lt_compile\"" >&5)
     14034   (eval echo "\"\$as_me:14034: $lt_compile\"" >&5)
    1402614035   (eval "$lt_compile" 2>out/conftest.err)
    1402714036   ac_status=$?
    1402814037   cat out/conftest.err >&5
    14029    echo "$as_me:14029: \$? = $ac_status" >&5
     14038   echo "$as_me:14038: \$? = $ac_status" >&5
    1403014039   if (exit $ac_status) && test -s out/conftest2.$ac_objext
    1403114040   then
     
    1407514084   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    1407614085   -e 's:$: $lt_compiler_flag:'`
    14077    (eval echo "\"\$as_me:14077: $lt_compile\"" >&5)
     14086   (eval echo "\"\$as_me:14086: $lt_compile\"" >&5)
    1407814087   (eval "$lt_compile" 2>out/conftest.err)
    1407914088   ac_status=$?
    1408014089   cat out/conftest.err >&5
    14081    echo "$as_me:14081: \$? = $ac_status" >&5
     14090   echo "$as_me:14090: \$? = $ac_status" >&5
    1408214091   if (exit $ac_status) && test -s out/conftest2.$ac_objext
    1408314092   then
     
    1616116170
    1616216171
     16172# ADOL-C with mpi
     16173
     16174# Check whether --with-mpi-includedir was given.
     16175if test "${with_mpi_includedir+set}" = set; then :
     16176  withval=$with_mpi_includedir; mpiinc=$withval
     16177else
     16178  mpiinc=auto
     16179fi
     16180
     16181
     16182# Check whether --with-mpi-libdir was given.
     16183if test "${with_mpi_libdir+set}" = set; then :
     16184  withval=$with_mpi_libdir; mpilibdir=$withval
     16185else
     16186  mpilibdir=auto
     16187fi
     16188
     16189
     16190if test x"$mpiinc" = xauto ; then
     16191MPICPPFLAGS=""
     16192else
     16193MPICPPFLAGS="-I${mpiinc}"
     16194fi
     16195if test x"$mpilibdir" = xauto ; then
     16196MPILIBS=""
     16197else
     16198MPILIBS="-L${mpilibdir}"
     16199fi
     16200
     16201save_CPPFLAGS="$CPPFLAGS"
     16202save_LIBS="$LIBS"
     16203CPPFLAGS="$CPPFLAGS $MPICPPFLAGS"
     16204LIBS="$LIBS $MPILIBS"
     16205for ac_header in mpi/mpi.h mpi.h
     16206do :
     16207  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
     16208ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
     16209if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
     16210  cat >>confdefs.h <<_ACEOF
     16211#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
     16212_ACEOF
     16213
     16214
     16215$as_echo "#define HAVE_MPI 1" >>confdefs.h
     16216
     16217if test x = x"$LIBMPI"; then
     16218{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPI_Init in -lmpi" >&5
     16219$as_echo_n "checking for MPI_Init in -lmpi... " >&6; }
     16220if ${ac_cv_lib_mpi_MPI_Init+:} false; then :
     16221  $as_echo_n "(cached) " >&6
     16222else
     16223  ac_check_lib_save_LIBS=$LIBS
     16224LIBS="-lmpi  $LIBS"
     16225cat confdefs.h - <<_ACEOF >conftest.$ac_ext
     16226/* end confdefs.h.  */
     16227
     16228/* Override any GCC internal prototype to avoid an error.
     16229   Use char because int might match the return type of a GCC
     16230   builtin and then its argument prototype would still apply.  */
     16231#ifdef __cplusplus
     16232extern "C"
     16233#endif
     16234char MPI_Init ();
     16235int
     16236main ()
     16237{
     16238return MPI_Init ();
     16239  ;
     16240  return 0;
     16241}
     16242_ACEOF
     16243if ac_fn_c_try_link "$LINENO"; then :
     16244  ac_cv_lib_mpi_MPI_Init=yes
     16245else
     16246  ac_cv_lib_mpi_MPI_Init=no
     16247fi
     16248rm -f core conftest.err conftest.$ac_objext \
     16249    conftest$ac_exeext conftest.$ac_ext
     16250LIBS=$ac_check_lib_save_LIBS
     16251fi
     16252{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpi_MPI_Init" >&5
     16253$as_echo "$ac_cv_lib_mpi_MPI_Init" >&6; }
     16254if test "x$ac_cv_lib_mpi_MPI_Init" = xyes; then :
     16255  LIBMPI="-lmpi"
     16256fi
     16257
     16258fi
     16259if test x = x"$LIBMPI"; then
     16260{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPI_Init in -lmpich" >&5
     16261$as_echo_n "checking for MPI_Init in -lmpich... " >&6; }
     16262if ${ac_cv_lib_mpich_MPI_Init+:} false; then :
     16263  $as_echo_n "(cached) " >&6
     16264else
     16265  ac_check_lib_save_LIBS=$LIBS
     16266LIBS="-lmpich  $LIBS"
     16267cat confdefs.h - <<_ACEOF >conftest.$ac_ext
     16268/* end confdefs.h.  */
     16269
     16270/* Override any GCC internal prototype to avoid an error.
     16271   Use char because int might match the return type of a GCC
     16272   builtin and then its argument prototype would still apply.  */
     16273#ifdef __cplusplus
     16274extern "C"
     16275#endif
     16276char MPI_Init ();
     16277int
     16278main ()
     16279{
     16280return MPI_Init ();
     16281  ;
     16282  return 0;
     16283}
     16284_ACEOF
     16285if ac_fn_c_try_link "$LINENO"; then :
     16286  ac_cv_lib_mpich_MPI_Init=yes
     16287else
     16288  ac_cv_lib_mpich_MPI_Init=no
     16289fi
     16290rm -f core conftest.err conftest.$ac_objext \
     16291    conftest$ac_exeext conftest.$ac_ext
     16292LIBS=$ac_check_lib_save_LIBS
     16293fi
     16294{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpich_MPI_Init" >&5
     16295$as_echo "$ac_cv_lib_mpich_MPI_Init" >&6; }
     16296if test "x$ac_cv_lib_mpich_MPI_Init" = xyes; then :
     16297  LIBMPI="-lmpich"
     16298fi
     16299
     16300fi
     16301break
     16302
     16303fi
     16304
     16305done
     16306
     16307CPPFLAGS="$save_CPPFLAGS"
     16308LIBS="$save_LIBS"
     16309
     16310
     16311
     16312
     16313 if test x != x"$LIBMPI"; then
     16314  HAVE_MPI_TRUE=
     16315  HAVE_MPI_FALSE='#'
     16316else
     16317  HAVE_MPI_TRUE='#'
     16318  HAVE_MPI_FALSE=
     16319fi
     16320
     16321if test x != x"$LIBMPI" ; then
     16322mpi=yes
     16323else
     16324mpi=no
     16325fi
     16326
    1616316327# ADOL-C Examples
    1616416328{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build documented examples" >&5
     
    1656316727Usually this means the macro was only invoked conditionally." "$LINENO" 5
    1656416728fi
     16729if test -z "${HAVE_MPI_TRUE}" && test -z "${HAVE_MPI_FALSE}"; then
     16730  as_fn_error $? "conditional \"HAVE_MPI\" was never defined.
     16731Usually this means the macro was only invoked conditionally." "$LINENO" 5
     16732fi
    1656516733if test -z "${DOCEXA_TRUE}" && test -z "${DOCEXA_FALSE}"; then
    1656616734  as_fn_error $? "conditional \"DOCEXA\" was never defined.
     
    1698417152# values after options handling.
    1698517153ac_log="
    16986 This file was extended by adolc $as_me 2.2.0-trunk, which was
     17154This file was extended by adolc $as_me 2.2.0-trunk-mpi, which was
    1698717155generated by GNU Autoconf 2.68.  Invocation command line was
    1698817156
     
    1705017218ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
    1705117219ac_cs_version="\\
    17052 adolc config.status 2.2.0-trunk
     17220adolc config.status 2.2.0-trunk-mpi
    1705317221configured by $0, generated by GNU Autoconf 2.68,
    1705417222  with options \\"\$ac_cs_config\\"
     
    1917419342    warn=true
    1917519343fi
     19344echo \
     19345"  Build with MPI:                   ${mpi}"
    1917619346echo
    1917719347
  • branches/MPI/configure.ac

    r211 r240  
    1414AC_PREREQ(2.57)
    1515AC_INIT(adolc,
    16         ADOLC_VER.ADOLC_SUB.ADOLC_LVL-trunk,
     16        ADOLC_VER.ADOLC_SUB.ADOLC_LVL-trunk-mpi,
    1717        [adol-c@list.coin-or.org])
    1818AC_REVISION($Revision$)
     
    249249AC_SUBST(COLPACK_LIBS)
    250250
     251# ADOL-C with mpi
     252AC_ARG_WITH(mpi-includedir,[AS_HELP_STRING([--with-mpi-includedir],[path to mpi headers [default=autodetect]])], [mpiinc=$withval], [mpiinc=auto])
     253AC_ARG_WITH(mpi-libdir,[AS_HELP_STRING([--with-mpi-libdir],[path to mpi libs [default=autodetect]])], [mpilibdir=$withval], [mpilibdir=auto])
     254
     255if test x"$mpiinc" = xauto ; then
     256MPICPPFLAGS=""
     257else
     258MPICPPFLAGS="-I${mpiinc}"
     259fi
     260if test x"$mpilibdir" = xauto ; then
     261MPILIBS=""
     262else
     263MPILIBS="-L${mpilibdir}"
     264fi
     265
     266save_CPPFLAGS="$CPPFLAGS"
     267save_LIBS="$LIBS"
     268CPPFLAGS="$CPPFLAGS $MPICPPFLAGS"
     269LIBS="$LIBS $MPILIBS"
     270AC_CHECK_HEADERS([mpi/mpi.h mpi.h],[
     271AC_DEFINE(HAVE_MPI,1,[MPI is enabled])
     272if test x = x"$LIBMPI"; then
     273AC_CHECK_LIB(mpi, MPI_Init, [LIBMPI="-lmpi"])
     274fi
     275if test x = x"$LIBMPI"; then
     276AC_CHECK_LIB(mpich, MPI_Init, [LIBMPI="-lmpich"])
     277fi
     278break
     279])
     280CPPFLAGS="$save_CPPFLAGS"
     281LIBS="$save_LIBS"
     282
     283AC_SUBST(MPICPPFLAGS)
     284AC_SUBST(MPILIBS)
     285AC_SUBST(LIBMPI)
     286AM_CONDITIONAL(HAVE_MPI,[test x != x"$LIBMPI"])
     287if test x != x"$LIBMPI" ; then
     288mpi=yes
     289else
     290mpi=no
     291fi
     292
    251293# ADOL-C Examples
    252294AC_MSG_CHECKING(whether to build documented examples)
     
    470512    warn=true
    471513fi
     514echo \
     515"  Build with MPI:                   ${mpi}"
    472516echo
    473517
Note: See TracChangeset for help on using the changeset viewer.