1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
#include <stdio.h>
#include <stdlib.h>
#include "CModlin.h"
#include "../trace.h"
#include "../commun.h"
// FORTRAN routines have to be prototyped as extern, and parameters are
// passed by reference. Note also that for g77 the function name in C by
// default must be prefixed by a "_".
#ifndef unix
__MINGW_IMPORT void modlin_OM(float pmt[], float abaque[][], float don[][], float cond[], float res[][], int flag[]) ;
#else
extern void modlin_om_(float * pmt, float * abaque, float * don, float * cond, float * res, int * flag) ;
#endif
/*
* Class: fr_edf_mpv2_serveurcalcul_castor_transverse_traitement_outilmetier_TrtModlin
* Method: modlin_OM
* Signature: ([F[[F[[F[F[[D[I)I
*/
JNIEXPORT jint JNICALL Java_fr_edf_mpv2_serveurcalcul_castor_transverse_traitement_outilmetier_TrtModlin_modlin_1OM
(JNIEnv * env, jobject obj,
jfloatArray pmtPar,
jobjectArray abaquePar, jobjectArray donPar, jfloatArray condPar, jobjectArray resPar, jintArray flagPar)
{
float ** don0 = NULL ; // Pour pouvoir désallouer les élèments Java
float ** abaque0 = NULL ; // Pour pouvoir désallouer les élèments Java
int err = 0 ;
jfloat *pmt;
jfloat *cond;
jfloat * abaque; //[SIZE_DON_2][SIZE_DON_1] ;
jfloat * don; //[SIZE_DON_2][SIZE_DON_1] ;
jfloat * res, * resSvg ; //[SIZE_RES_2][SIZE_RES_1] ; // Resultats
int * flag ; //[SIZE_FLAG] ; // Retour Erreur
int iFlag=0 ;
SetLogFileName("Modlin.log") ;
//
// Init paramètre : pmt
//
if((err = GetTableauFloat("pmt", env, pmtPar, & pmt))== 0)
{
//
// Init paramètre : abaque
//
if((err = GetMatriceFloat("abaque", env, abaquePar, & abaque0, & abaque))== 0)
{
//
// Init paramètre : cond
//
if((err = GetTableauFloat("cond", env, condPar, & cond)) == 0)
{
//
// Init parametre : don
//
if((err = GetMatriceFloat("don", env, donPar, & don0, & don)) == 0)
{
//
// Allocation du tableau résultat
//
ZTrace("Allocation res") ;
if((err = AllocationMatriceFloat("res", env, resPar, & res)) == 0)
{
//
// Allocation du tableau flag
//
if((err = AllocationTableauInt("flag", env, flagPar, & flag)) == 0)
{
resSvg = res ;
ZTrace("flag = %x res = %x", flag, res) ;
//
// Appel routine fortran
//
ZTrace("Appel modlin_OM") ;
#ifndef unix
modlin_OM(pmt, abaque, don, cond, res, & iFlag) ;
#else
modlin_om_(pmt, abaque, don, cond, res, & iFlag) ;
#endif
ZTrace("Retour modlin_OM") ;
ZTrace("flag = %x res = %x", flag, res) ;
//
// Traitement paramètre de retour : flag
//
flag[0] = iFlag ;
if((err = TransfertTableauInt("flag", env, flagPar, flag)) == 0)
{
res = resSvg ;
//
// Traitement paramètre de retour : res
//
if((err = TransfertMatriceFloat("res", env, resPar, res)) == 0)
{
}
}
ZTrace("Libère flag") ;
free(flag) ;
}
ZTrace("Libère res") ;
free(res) ;
}
ZTrace("Libère don") ;
free(don) ;
if(don0)
FreeMatriceFloat(env, donPar, don0) ;
}
(*env)->ReleaseFloatArrayElements(env, condPar, cond, JNI_ABORT) ;
}
ZTrace("Libère abaque") ;
free(abaque);
if(abaque0)
FreeMatriceFloat(env, abaquePar, abaque0) ;
}
(*env)->ReleaseFloatArrayElements(env, pmtPar, pmt, JNI_ABORT) ;
}
return err ;
} |
Partager