================================================================================ ================================================================================ ======= INSTRUCCIONES DE UTILIZACION DE LA SUBRUTINA SLE$Solver_PCG_ER() ====== ================================================================================ ================================================================================ Archivos que componen el Kit: modsys_pcg_er.txt --------> Estas instrucciones modsys_pcg_er.for --------> El código de la subrutina modsys_pcg_er.f --------> El código de la subrutina (adaptado a GFortran) makelibsyspcger.vms --------> Programa de comandos VMS para montar la librería makefile --------> Archivo makefile (Unix) makelibsyspcger.bat --------> Programa de comandos DOS para montar la librería UTILIZACIÓN DE LA SUBRUTINA DESDE UN PROGRAMA FORTRAN ===================================================== c------------------------------------------------------------------------------ c------------------------------------------------------------------------------ c MI_PROGRAMA.FOR c------------------------------------------------------------------------------ c------------------------------------------------------------------------------ implicit real*8 (a-h,o-z) parameter (MXDOFN= ..., MXSTRE= ..., MXDIME= ..., . MXPROP= ..., MXMATS= ..., . MXNODE= ..., MXEVAB=MXDOFN*MXNODE, . MXPOIN= ..., MXTOTV=MXDOFN*MXPOIN, . MXELEM= ..., . MXVFIX= ..., . MXRIGI= MXTOTV, . MXWORK=3*MXTOTV) logical cnvgc dimension lnods(MXNODE*MXELEM),lpamc(MXTOTV), . coord(MXDIME*MXPOIN),elcod(MXDIME*MXNODE), . matno(MXELEM),props(MXPROP*MXMATS), . ngfix(MXVFIX),presc(MXVFIX),treac(MXVFIX), . gload(MXTOTV),eload(MXEVAB), . xdisp(MXTOTV),eldis(MXEVAB), . resdl(MXTOTV),elres(MXEVAB), . eldef(MXSTRE),elstr(MXSTRE), . dmatx(MXSTRE*MXSTRE),bmatx(MXSTRE*MXEVAB), . wrksp(MXWORK),rgmat(MXRIGI) ... ... ... niter=ntotv+10 !se permiten 10 iteraciones mas nactu=100 !se recalcula el residuo una vez de cada 100 epslx=1.d-12 rltvx=1.d-08 epslr=1.d-12 rltvr=1.d-08 do itotv=1,ntotv xdisp(itotv)=0.d+00 !si no tenemos nada mejor enddo kplibre=1 call DimensionamientoDinamico(mxwork,kplibre,ntotv,kpw) call DimensionamientoDinamico(mxwork,kplibre,ntotv,kps) call DimensionamientoDinamico(mxwork,kplibre,ntotv,kpz) call SLE$Solver_PCG_ER(ntype,nnode,nelem,nprop,nmats, . nstre,ndime,ndofn,npoin, . nevab,ntotv, . lnods,coord,elcod,matno,props, . nvfix,ngfix,presc, . lpamc,rgmat,gload, . eldis,eldef,elstr,eload,elres, . dmatx,bmatx, . niter,nactu, . epslx,rltvx,epslr,rltvr, . wrksp(kpw),wrksp(kps),wrksp(kpz), . xdisp,resdl,treac, . rnorm,kiter,cnvgc) if (.not.cnvgc) then call ErrorFatal('PCG no ha convergido') endif ... ... ... end c_______________________________________________________DimensionamientoDinamico Subroutine DimensionamientoDinamico(MXKP,kplibre,ncomponentes,kp) kp=kplibre kplibre=kplibre+ncomponentes if (kplibre.gt.MXKP+1) call ErrorFatal('Memoria insuficiente') return end c_____________________________________________________________________ErrorFatal Subroutine ErrorFatal(mensaje) character*(*) mensaje write(6,100) mensaje 100 format(' Error: ',a) stop end COMPILACIÓN Y LINKADO CON DIGITAL FORTRAN 77 EN OpenVMS ======================================================= Se recomienda a cada estudiante que abra en su cuenta un subdirectorio nuevo (por ejemplo [.PCGER]) y que copie allí el código de la subrutina y los ficheros adicionales. Esto es: ... entrar en ZEUS ... $ create/dir [.pcger] $ set def [.pcger] $ copy disk$alu:[m_master.soft.sys.pcg_er]*.* [] A partir de este momento, para montar la libreria... $ @makelibsyspcger.vms El programa mi_programa.for que usa esta subrutina, se compila y linka en la forma: $ for mi_programa $ link mi_programa+dlibsyspcger/lib Existe una version de esta libreria en ZEUS que puede ser utilizada directamente por todos los usuarios, "linkando" en la forma: $ link mi_programa+'LMNAD_PCGER Programa de comandos makelibsyspcger.vms ---------------------------------------- $ set verify $ for/d_lines modsys_pcg_er/object=modsys_pcg_er.obj $ lib/create dlibsyspcger.olb modsys_pcg_er.obj $ delete modsys_pcg_er.obj;* $ set noverify Observaciones (OpenVMS) ----------------------- 1) OpenVMS no distingue entre mayúsculas y minúsculas en el nombre de los archivos (en realidad sólo utiliza mayúsculas, pero acepta las minúsculas como equivalentes). COMPILACIÓN Y LINKADO CON COMPAQ FORTRAN 90 EN True64Unix ========================================================= Los archivos deben copiarse desde la página web de la asignatura. La subrutina y el programa mi_programa.for se pueden compilar por separado y linkar conjuntamente en la forma: > f90 mi_programa.for -d_lines -O4 -c -o mi_programa.o > f90 modsys_pcg_er.for -d_lines -O4 -c -o dlibsyspcger.o > f90 mi_programa.o dlibsyspcger.o -O4 -o mi_programa La subrutina y el programa mi_programa.for también se pueden compilar y linkar conjuntamente en la forma: > f90 mi_programa.for modsys_pcg_er.for -d_lines -O4 -o mi_programa Se recomienda crear la librería libsyspcger.a y linkarla posteriormente con el programa mi_programa.for en la forma: > f90 modsys_pcg_er.for -d_lines -O4 -c -o dlibsyspcger.o > ar r libsyspcger.a dlibsyspcger.o > f90 mi_programa.for -d_lines -O4 -c -o mi_programa.o > f90 mi_programa.o -L. -lsyspcger -O4 -o mi_programa Alternativamente puede realizarse un archivo makefile y utilizar la instrucción > make mi_programa Archivo makefile ---------------- mi_programa: mi_programa.for libsyspcger.a f90 mi_programa.for -d_lines -O4 -c -o mi_programa.o f90 mi_programa.o -L. -lsyspcger -O4 -o mi_programa rm mi_programa.o echo ">>> mi_programa ha sido compilado y linkado con exito" libsyspcger.a: modsys_pcg_er.for f90 modsys_pcg_er.for -d_lines -O4 -c -o dlibsyspcger.o ar r libsyspcger.a dlibsyspcger.o rm dlibsyspcger.o Observaciones (True64Unix) -------------------------- 1) El sistema operativo distingue entre mayúsculas y minúsculas en el nombre de los archivos. COMPILACIÓN Y LINKADO CON GFORTRAN EN WINDOWS O EN LINUX ======================================================== Los archivos deben copiarse desde la página web de la asignatura. La subrutina y el programa mi_programa.for se pueden compilar por separado y linkar conjuntamente en la forma: > gfortran mi_programa.f -fdollar-ok -O2 -c -o mi_programa.o > gfortran modsys_pcg_er.f -fdollar-ok -O2 -c -o dlibsyspcger.o > gfortran mi_programa.o dlibsyspcger.o -O2 -o mi_programa La subrutina y el programa mi_programa.for también se pueden compilar y linkar conjuntamente en la forma: > gfortran mi_programa.f modsys_pcg_er.f -fdollar-ok -O2 -o mi_programa Se recomienda crear la librería libsyspcger.a y linkarla posteriormente con el programa mi_programa.for en la forma: > gfortran modsys_pcg_er.f -fdollar-ok -O2 -c -o dlibsyspcger.o > ar r libsyspcger.a dlibsyspcger.o > gfortran mi_programa.f -fdollar-ok -O2 -c -o mi_programa.o > gfortran mi_programa.o -L. -lsyspcger -O2 -o mi_programa El programas de comandos DOS makelibsyspcger.bat permite crear directamente la libería libsyspcger.a en Windows. Programa de comandos makelibsyspcger.bat ------------------------------------- gfortran modsys_pcg_er.f -fdollar-ok -O2 -c -o dlibsyspcger.o ar r libsyspcger.a dlibsyspcger.o del dlibsyspcger.o Observaciones (WXP o Linux) -------------------------- 1) Es posible que el sistema operativo distinga entre mayúsculas y minúsculas en el nombre de los archivos.