next up previous
Next: Örnek 3 Up: Paralel Grid Ortami1 ( Previous: Örnek 1

Örnek 2

Ikinci örnek ise PME'nin grid uyarlama kabiliyetini göstermeyi amaçliyor. Asagidaki program kare gridini (bak. Sekil 1(a)) yükler, birkaç kez düzenli uyarlama yaparak grid elemanlarinin sayisini artirir (bak. Sekil 2(a)), en sonundada gridin sol kenarina seçici bir sekilde ince uyarlama yapar. Seçici uyarlama sonucu çikan grid Sekil 2(b)'de verilmistir. Program derlendikten sonra söyle çalistirilabilir:

mpirun -np 4 ornek2 kare 4 3

ornek2 program isminden sonra gelen ilk parametre kaç kere düzenli uyarlama yapilacagini, ikinci parametre ise sol alt kenarda kaç kere seçici uyarlama yapilacagini belirtir. Örnek 2 kaynak programi asagida verilmistir.


#include <stdio.h>
#include "mpi.h"
#include "libpme.h"

void refine1(pMesh) ;
void refine2(pMesh) ;
int  mypid ;

main(
int   argc,
char *argv[])
{

    char      file[20]        ;
    int       rc              ;
    pMesh     mesh            ;
    int       i               ;

    MPI_Init(&argc,&argv) ;
    MPI_Comm_rank(MPI_COMM_WORLD,&mypid) ;

    sprintf(file,"%s.%d.msh",argv[1],mypid) ;

    mesh  = pme_new_msh(MPI_COMM_WORLD,NULL) ;

    rc = pme_read_msh(mesh,file) ;
    pme_part_inertia(mesh) ;

    for(i=0 ; i < atoi(argv[2]) ; i++) {
      refine1(mesh) ;
    }
    pme_off_2d(mesh,"refine1") ;
    printf("NUMELEMENTS=%d\n",pme_num_entity(mesh,PME_FACE)) ;

    for(i=0 ; i < atoi(argv[3]) ; i++) {
      refine2(mesh) ;
    }
    pme_off_2d(mesh,"refine2") ;
    printf("NUMELEMENTS=%d\n",pme_num_entity(mesh,PME_FACE)) ;

    MPI_Finalize() ;
    exit(0) ;
}

/* Duzenli ince uyarlama yap */
void refine1(
pMesh mesh)
{
   AttchTag mark_tag ;
   pFace    face     ;
   void    *temp     ;

   pme_new_attch_tag(mesh,0,PME_ATTCH_NOT_FREE,&mark_tag) ;

   /* butun elemanlari uyarlanmak icin isaretle */
   temp = NULL ;
   while ( face = (pFace) pme_next_entity(mesh,PME_FACE,&temp) ) {
     pme_ins_data_attch(face,mark_tag,(void *)1) ;
   }

   pme_ref_rivara(mesh,mark_tag) ;

   temp = NULL ;
   while( face = (pFace) pme_next_entity(mesh,PME_FACE,&temp) ) {
      pme_del_data_attch(face,mark_tag) ;
   }

   pme_del_attch_tag(mesh,mark_tag) ;
}

/* Secici ince uyarlama yap */
void refine2(
pMesh mesh)
{
   AttchTag mark_tag ;
   pFace    face     ;
   void    *temp     ;
   double   xyz[3]   ;

   pme_new_attch_tag(mesh,0,PME_ATTCH_NOT_FREE,&mark_tag) ;

   /* sol alt kenardaki elemanlari uyarlanmak icin isaretle */
   if (mypid == 0) {
     temp = NULL ;
     while (face = (pFace) pme_next_entity(mesh,PME_FACE,&temp) ) {
        pme_get_centroid(mesh,face,xyz) ;
        if ( (xyz[0]  < -0.45 ) && (xyz[1] < -0.45 ) ) {
          pme_ins_data_attch(face,mark_tag,(void *)1) ;
        }
     }
   }

   pme_ref_rivara(mesh,mark_tag) ;

   temp = NULL ;
   while( face = (pFace) pme_next_entity(mesh,PME_FACE,&temp) ) {
      pme_del_data_attch(face,mark_tag) ;
   }

   pme_del_attch_tag(mesh,mark_tag) ;
}



Can Ozturan
2001-12-22