Skip to main content

Free Finite Element Programs in Fortran 95

Submitted by Jinsong Huang on

Programs from Programming the Finite Element Method by Ian M. Smith and D. V. Griffiths are downloadable from: www.mines.edu/~vgriffit/4th_ed/Software This title demonstrates how to develop computer programmes which solve specific engineering problems using the finite element method. It enables students, scientists and engineers to assemble their own computer programmes to produce numerical results to solve these problems. The first three editions of Programming the Finite Element Method established themselves as an authority in this area. This fully revised 4th edition includes completely rewritten programmes with a unique description and list of parallel versions of programmes in Fortran 90. The Fortran programmes and subroutines described in the text will be made available on the Internet via anonymous ftp, further adding to the value of this title. From the Back Cover Following the highly successful previous editions, this 4th edition contains programs and subroutine libraries fully updated to Fortran95, which are freely available on the Internet. A wide variety of problem solving capabilities are presented including structural analysis, elasticity and plasticity, construction processes in geomechanics, uncoupled and coupled steady and transient fluid flow and linear and nonlinear solid dynamics. A major new feature is the inclusion of parallelised programs, using MPI, which enable parallel processing of all types of finite element analyses. Performance evaluation shows that these programs make efficient use of parallel hardwares ranging from supercomputers to clusters of PCs. Key features include: A clear outline of modular programming philosophy. More than 60 programs covering a wide range of problems in engineering and science. Results display using PostScript files. Exercises for students to solve. A simple but powerful parallelisation strategy. These improvements all contribute to a more comprehensive book with a wide appeal. It will be of particular interest to students and practitioners in the application of finite element methods; to undergraduates and postgraduates in civil, mechanical and aeronautical engineering (stress analysis and fluid flow problems); to applied mathematicians and physicists (solution of partial differential equations); and to engineers in all of the above fields.

Hello

I'm trying to remove some rows and columns which have zero elements. Actually, i'm employing the boundary conditions to a matrix.

I wrote the following code and it works well. but, ineed to make it as a subroutine. To this end, i change a bit the following code. but, it doesn't work. I'm not sure it is possible to make a subroutine. Whould you mind helping me. I already appreciate.

program main

real ,allocatable :: matrix(:,:)

real, allocatable :: NNN(:,:),NNN_abated(:,:),NNN_final(:,:)  ! the array

integer i,j,count1,count2,nzero



allocate(matrix(3,5))

allocate (NNN(3,5))

matrix(1,:)=(/5,0,24,63,0/)

matrix(2,:)=(/0,0,0,0,0/)

matrix(3,:)=(/1,0,7,32,0/)



count1=0        ! count1 is corresponding to the number of non-zero rows of any matrix

do i=1,3        ! i is for reckoning the rows, 3 is the maximum value of the rows

       nzero=0  ! number of zeros in a row or column

    do j=1,5    ! j is for reckoning the columns, 5 is the maximum value of the columns

       if (matrix(i,j)==(0))then  ! calculation of the number of zeros in a row of the matrix

       nzero=nzero+1

       endif

    enddo

    if ((nzero).ne.(5)) then  !investigating whether all of the elements of the row is zero or not

    count1=count1+1           !number of non-zero rows

    NNN(count1,:)=matrix(i,:) !transmission of the non-zero rows to the top rows

    endif

enddo

allocate (NNN_abated(count1,5)) ! removing the zero rows by employing another matrix

count2=0   ! count2 is corresponding to the number of non-zero columns of any matrix

do j=1,5

       nzero=0

    do i=1,3

       if (NNN(i,j)==(0,0))then

       nzero=nzero+1

       endif

    enddo

    if ((nzero).ne.(3)) then

    count2=count2+1          !number of non-zero columns

    NNN_abated(:,count2)=NNN(:,j)  !transmission of the non-zero columns to the left columns

    endif

enddo



allocate (NNN_final(count1,count2)) ! in this matrix all the zero rows and columns are eliminated

do i=1,count1

   do j=1,count2

      NNN_final(i,j)=NNN_abated(i,j)

   enddo

enddo

print*,count1,count2

end

Fri, 04/13/2012 - 13:03 Permalink

Hi,

I cannot understand the how the bandwidth can be obtained by the following code:

 

 idof=SIZE(g)

!idof=6

 DO i=1,idof

   iwp1=1

   IF(g(i)/=0)THEN !non-zero freedom

     DO j=1,idof

       IF(g(j)/=0)THEN

         im=g(i)-g(j)+1

         IF(im>iwp1)iwp1=im

       END IF

     END DO !after this loop, iwp1 gets its largest value for g(i)

     k=g(i)

     IF(iwp1>kdiag(k))kdiag(k)=iwp1

!kdiag=0 by default

   END IF

 END DO

 RETURN

 !-----------------------

Thank you! 

 

 

Mon, 05/20/2013 - 10:07 Permalink