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) ; }