================================================================================ ================================================================================ ====== INSTRUCCIONES DE UTILIZACION DE LA SUBRUTINA SLE$Solver_PCG_CP() ======= ================================================================================ ================================================================================ Archivos que componen el Kit: modsys_pcg_cp.txt --------> Estas instrucciones modsys_pcg_cp.for --------> El código de la subrutina modsys_pcg_cp.f --------> El código de la subrutina (adaptado a GFortran) prueba.for --------> Programa de prueba para la subrutina prueba.f --------> Programa de prueba para la subrutina (adaptado a GFortran) makelibsyspcgcp.vms --------> Programa de comandos VMS para montar la librería makefile --------> Archivo makefile (Unix) makelibsyspcgcp.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 (TODAS LAS VARIABLES REALES DEBEN SER DEL TIPO REAL*8) c------------------------------------------------------------------------------ c------------------------------------------------------------------------------ implicit real*8 (a-h,o-z) parameter (MXVFIX= ..., MXTOTV= ..., MXRIGI= ...) logical cnvgc dimension lpamc(MXTOTV), . ngfix(MXVFIX),presc(MXVFIX),treac(MXVFIX), . gload(MXTOTV),xdisp(MXTOTV),resdl(MXTOTV), . wrksp(3*MXTOTV), . 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(3*mxtotv,kplibre,ntotv,kpw) call DimensionamientoDinamico(3*mxtotv,kplibre,ntotv,kps) call DimensionamientoDinamico(3*mxtotv,kplibre,ntotv,kpz) call SLE$Solver_PCG_CP(ntotv,lpamc,rgmat,gload, . nvfix,ngfix,presc, . 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 [.PCG]) y que copie allí el código de la subrutina y los ficheros adicionales. Esto es: ... entrar en ZEUS ... $ create/dir [.pcg] $ set def [.pcg] $ copy disk$alu:[m_master.soft.sys.pcg_cp]*.* [] A partir de este momento, para montar la libreria... $ @makelibsyspcgcp.vms El programa mi_programa.for que usa esta subrutina, se compila y linka en la forma: $ for mi_programa $ link mi_programa+dlibsyspcgcp/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_PCGCP Programa de comandos makelibsyspcgcp.vms ---------------------------------------- $ set verify $ for/d_lines modsys_pcg_cp/object=modsys_pcg_cp.obj $ lib/create dlibsyspcgcp.olb modsys_pcg_cp.obj $ delete modsys_pcg_cp.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_cp.for -d_lines -O4 -c -o dlibsyspcgcp.o > f90 mi_programa.o dlibsyspcgcp.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_cp.for -d_lines -O4 -o mi_programa Se recomienda crear la librería libsyspcgcp.a y linkarla posteriormente con el programa mi_programa.for en la forma: > f90 modsys_pcg_cp.for -d_lines -O4 -c -o dlibsyspcgcp.o > ar r libsyspcgcp.a dlibsyspcgcp.o > f90 mi_programa.for -d_lines -O4 -c -o mi_programa.o > f90 mi_programa.o -L. -lsyspcgcp -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 libsyspcgcp.a f90 mi_programa.for -d_lines -O4 -c -o mi_programa.o f90 mi_programa.o -L. -lsyspcgcp -O4 -o mi_programa rm mi_programa.o echo ">>> mi_programa ha sido compilado y linkado con exito" libsyspcgcp.a: modsys_pcg_cp.for f90 modsys_pcg_cp.for -d_lines -O4 -c -o dlibsyspcgcp.o ar r libsyspcgcp.a dlibsyspcgcp.o rm dlibsyspcgcp.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_cp.f -fdollar-ok -O2 -c -o dlibsyspcgcp.o > gfortran mi_programa.o dlibsyspcgcp.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_cp.f -fdollar-ok -O2 -o mi_programa Se recomienda crear la librería libsyspcgcp.a y linkarla posteriormente con el programa mi_programa.for en la forma: > gfortran modsys_pcg_cp.f -fdollar-ok -O2 -c -o dlibsyspcgcp.o > ar r libsyspcgcp.a dlibsyspcgcp.o > gfortran mi_programa.f -fdollar-ok -O2 -c -o mi_programa.o > gfortran mi_programa.o -L. -lsyspcgcp -O2 -o mi_programa El programas de comandos DOS makelibsyspcgcp.bat permite crear directamente la libería libsyspcgcp.a en Windows. Programa de comandos makelibsyspcgcp.bat ---------------------------------------- gfortran modsys_pcg_cp.f -fdollar-ok -O2 -c -o dlibsyspcgcp.o ar r libsyspcgcp.a dlibsyspcgcp.o del dlibsyspcgcp.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.