Articles of Fortran

Analógico STL en Fortran

Base: tengo un progtwig paralelo Fortran90 / MPI muy grande que representa un modelo físico complejo. Quiero agregarle nuevas funcionalidades: por ejemplo, necesito organizar la cola de mensajes, introducir mergesort en alguna parte y usar tablas hash. Problema: sé cómo escribir tabla hash, crear cola y código mergesort solo, pero no creo que sea una […]

¿Qué significa “real * 8”?

El manual de un progtwig escrito en Fortran 90 dice: “Todas las variables y parámetros reales se especifican en precisión de 64 bits (es decir, real*8 )”. Según Wikipedia , la precisión simple corresponde a la precisión de 32 bits, mientras que la precisión doble corresponde a la precisión de 64 bits, por lo que […]

Crear una interfaz FORTRAN para una función C que devuelve un carácter *

Me he retrasado en esto durante una semana, y he buscado foro tras foro para obtener una explicación clara de cómo enviar un char * de C a FORTRAN. Para hacer que el asunto sea más frustrante, enviar un argumento de char * de FORTRAN a C fue directo … Enviar un argumento char * […]

cómo escribir un contenedor para ‘asignar’

Estoy intentando escribir un wrapper para la función ‘allocate’, es decir, función que recibe una matriz y dimensiones, asigna memoria y devuelve la matriz asignada. Lo más importante es que la función debe funcionar con matrices de diferente rango. Pero tengo que indicar explícitamente rango de matriz en la interfaz de función, y en este […]

¿Por qué debería usar interfaces?

Cada vez que programo en Fortran, uso módulos y no tengo que preocuparme por escribir interfaces. Ahora estoy escribiendo el código Fortran para usar dentro de R. El problema es que las subrutinas no pueden estar dentro de un módulo, así que “tengo” que escribir interfaces. Si no escribo la interfaz todo funciona bien, pero […]

Error: ancho no negativo requerido en cadena de formato en (1)

Estoy intentando comstackr un código con gfortran y está fallando con el siguiente error: Error: Nonnegative width required in format string at (1) ../src/powmes.f90:410.20: write(lunit,'(I,E,E,E)’) wavenum(k),power(k),nmodes(k),errorexpan(k) 414 if (filepower_fold(1:1) /= ‘#’) then 415 fileout=trim(filepower_fold)//’.waven’ 416 if (verbose) write(*,*) ‘Output ‘//trim(fileout) 417 open(file=fileout,form=’formatted’,status=’unknown’,unit=lunit,err=2) 418 do k=0,ngrid/2 419 do ifold=0,nfoldpow-1 420 write(lunit,'(I,$)’) waven(k,ifold) 421 enddo 422 write(lunit,'(I)’) […]

Función valorada de matriz asignable. gfortran vs ifort

¿Por qué hay diferentes comportamientos entre ifort y gfortran aquí? Comstackdo con ifort devuelve falso y con gfortran verdadero. Me encontré con este problema en mi propio código y decidí usar una subrutina en su lugar, pero una pregunta reciente me hizo cuestionar este comportamiento. function allocateArray(size) integer, allocatable, dimension(:) :: allocateArray integer size allocate(allocateArray(size)) […]

¿Por qué mis números aleatorios siempre son los mismos?

Estoy usando la subrutina random_number de Fortran, pero en diferentes ejecuciones del progtwig, el número que se está produciendo no cambia. ¿Qué debo incluir en mi código para que cada vez que compile y ejecute el progtwig cambien los números?

calcular integrales dobles en R rápidamente

Estoy buscando una solución para una integral doble que sea más rápida que integrate(function(y) { sapply(y, function(y) { integrate(function(x) myfun(x,y), llim, ulim)$value }) }, llim, ulim) con eg myfun <- function(x,y) cos(x+y) llim <- -0.5 ulim <- 0.5 Encontré un documento antiguo que se refería a un progtwig de FORTRAN llamado quad2d , pero no […]

gfortran para dummies: ¿Qué hace mcmodel = medium exactamente?

Tengo un código que me está dando errores de reubicación al comstackr, a continuación se muestra un ejemplo que ilustra el problema: program main common/baz/a,b,c real a,b,c b = 0.0 call foo() print*, b end subroutine foo() common/baz/a,b,c real a,b,c integer, parameter :: nx = 450 integer, parameter :: ny = 144 integer, parameter :: […]