PDA

Visualizza la versione completa : [C++] Creazione e uso di matrici per calcoli Abacus


alorenzom
06-06-2007, 09:04
Vorrei fare in C++ quello che in fortran si fa':




DOUBLE PRECISION MATRIX
INTEGER N
...
DIMENSION MATRIX(N,N)



giusto fare come segue?




int n;
...
double** pMatrix = new double*[n];
for(int i=0; i<n; i++)
pMatrix[i] = new double[n];



queste 2 allocazioni sono identiche o no?

Xaratroom
06-06-2007, 13:52
Ciao ...
E' corretto: prova anche te:


int n = 10;
double** matrix = new double*[n];
for(int i=0; i<n; i++)
matrix[i] = new double[n];
{
int app = 0;
for (unsigned int i = 0; i < n; i++)
for (unsigned int j = 0; j < n; j++)
matrix[i][j] = app++;
}
for (unsigned int i = 0; i < n; i++)
{
for (unsigned int j = 0; j < n; j++)
cout << matrix[i][j] << '\t';
cout << endl;
}

:ciauz:

alorenzom
12-06-2007, 17:29
Sto usando abaqus una suite di programmi per simulazioni di ingegneria. Devo lanciare una simulazione usando una user subroutine. Ho scritto la user subroutine in fortran (linguaggio consigliato da abaqus support) e la cosa andata a buon fine. Mi stato chiesto di scrivere la subroutine in C++ (Abaqus support dice che si pu fare).
La versione in c++ mi da dei problemi.

Ci sono differenze fra i seguenti codici?



#define FOR_NAME(lc_name,uc_name) _stdcall uc_name
#define CALL_NAME(lc_name,uc_name) uc_name

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

extern "C" void
FOR_NAME(uel, UEL)(double** RHS_,double** AMATRX_,double* pSvars,double* pEnergy,int* pNdofel,int* pNrhs,
int* pNsvars,double* pProps,int* pNprops,double** pCoords,int* pMcrd,int* pNnode,double* pU,double** pDu,double* pV,double* pA,int* pJtype,double* pTime,double* pDtime,
int* pKstep,int* pKinc,int* pJelem,double* pParams,int* pNdload,int** pJdltyp,double** pAdlmag,double*** pPredef,
int* pNpredf,int* pLflags,int* pMlvarx,double** pDdlmag,int* pMdload,double* pPnewdt,int* pJprops,int* pNjprop,
double* pPeriod){

AMATRX_ = new double*[*pNdofel];
for(int i=0; i<*pNdofel; i++)
AMATRX_[i] = new double[*pNdofel];

RHS_ = new double*[*pMlvarx];
for(int i=0; i<*pMlvarx; i++)
RHS_[i] = new double[1];

pDu = new double*[*pMlvarx];
for(int i=0; i<*pMlvarx; i++)
pDu[i] = new double[1];

pU = new double[*pNdofel];

.... istruzioni per il calcolo delle componenti di pAmatrx e pRhs....
}




SUBROUTINE UEL(RHS,AMATRX,SVARS,ENERGY,NDOFEL,NRHS,NSVARS,
1 PROPS,NPROPS,COORDS,MCRD,NNODE,U,DU,V,A,JTYPE,TIME ,DTIME,
2 KSTEP,KINC,JELEM,PARAMS,NDLOAD,JDLTYP,ADLMAG,PREDE F,
3 NPREDF,LFLAGS,MLVARX,DDLMAG,MDLOAD,PNEWDT,JPROPS,N JPROP,
4 PERIOD)
C
DIMENSION RHS(MLVARX,*),AMATRX(NDOFEL,NDOFEL),
1 SVARS(NSVARS),ENERGY(8),PROPS(*),COORDS(MCRD,NNODE ),
2 U(NDOFEL),DU(MLVARX,*),V(NDOFEL),A(NDOFEL),TIME(2) ,
3 PARAMS(3),JDLTYP(MDLOAD,*),ADLMAG(MDLOAD,*),
4 DDLMAG(MDLOAD,*),PREDEF(2,NPREDF,NNODE),LFLAGS(*),
5 JPROPS(*)
C
..........istruzioni per il calcolo delle componenti di AMATRX e RHS....
C
RETURN
END


Ho stampato pAmatrx (AMATRX) e pRhs (RHS) e sono uguali.

PERFAVORE DITEMI QUELLO CHE SAPETE A RIGUARDO!!!!!!!!!!!!!!! grazie in anticipo

Loading