Пласт сұйық ағымының есебiн параллельдеу бойынша алгоритмін құру. (полимерді пайдалану)

Автор работы: Пользователь скрыл имя, 30 Мая 2013 в 16:30, курсовая работа

Описание

Қазіргі таңдағы мұнай өндіру әдістерінде мұнайдың біршама бөлігі жер бетіне шығарылмай пластта қалып қалу мәселелерін тудырады. Ең болмағанда мұнай өндіру көлемін бір пайызға көтерудің өзі ел экономикасына әсерін тигізеді. Шет елдерде полимерлі заводнение технологиясын зерттеу анализдері бұл әдістің технологиялық эффективтилигіне куә болып табылады. Бірақта дәстүрлі мұнай кенінде кеңінен таралған полимерді пайдалану әдісіне қарамастан, тұтқырлығы жоғары мұнайды ығыстыру процесінде полимерді қолданылу зерттеуі толығымен жетілмеген.

Содержание

Кіріспе 1
1. Мәселенің қойылуы 4
1.1.Екі фазалы фильтрация жағдайындағы математикалық моделін құру…....4
1.2. Мұнайды алуға полимерді пайдалану………………………………………6
2. Есепті шешу әдістері мен алгоритмдері...........................................................8
2.1. Сандық әдістер көмегімен қойылған есептерді шешу…………………….8
2.1.1. Фазалардың қысымдарын табу…………………………………………....9
2.1.2. Жылдамдықтарды табу…………………………………………………..10
2.1.3. Фазалардың қанықтылықтарын табу……………………………………10
2.1.4. Полимердің концентрациясын табу……………………………………..10
3. Пласт сұйық ағымының есебiн параллельдеу бойынша алгоритм…… .....11
Қорытынды………………………………………………………………………16
Қолданылған әдебиеттер………………………………………………………..17
Қосымша…………………………………………………………………………18

Работа состоит из  1 файл

курсовая работа .docx

— 215.14 Кб (Скачать документ)

Осы топтардағы барлық процедуралар екі топқа бөлінеді: блокталған процедура(синхрондалған) және блокталмаған(асинхрондалған).Блокталған ақпарат алмасу жұмысты кейбір шарттар  орындағанға дейін баяулатады. Ал асинхрондалған процедуралардан қайтару  сәйкес коммуникаторлық операциялардың орындалғаннан кейін жүзеге асады. Блокталған процедураларды қолдану  кейде ақпарат алмасудағы кедергілерге алып келеді. Асинхрондық операцияларды  қолдану ақпарат алмасудағы кедергілерге алып келмейді.

 Блоктауы бар хабарлама жіберу/қабылдау

 

MPI_SEND(BUF, COUNT, DATATYPE, DEST, MSGTAG, COMM, IERR)

<type> BUF (*)

INTEGER COUNT, DATATYPE, DEST, MSGTAG, COMM, IERR

 

BUF массиві (ақпарат), MSGTAG ақпарат идентификаторы, COUNT элемент саны, DATATYPE ақпарат типі, DEST процесс нөмірі, COMM коммуникаторы бар хабарлама жіберу. Жіберілетін ақпараттың барлық элементтері BUF буферінде орналасуы тиіс. Сонымен қатар ақпарат қабылдау буферіне көшіріледі (жүйелік буфер, егер ол MPI-да көрсетілген болса). COUNT-ң мәні нөл болуы мүмкін. Процесске өз-өзіне ақпарат жіберу рұқсат етіледі, бірақ ол қауіпті емес және ақпарат алмасудағы кедергілік жағдайларға әкеліп тіреледі.  DATATYPE параметрі Фортран тілінде INTEGER типін алу керек ( Си тілінде – алдын ала анықталып қойған MPI_Datatype типі). Жіберілетін элементтердің типі алдын ала анықталған тұрақтылар типімен көрсетілуі керек, Фортран тіліне арналғн типтер елесі кестеде көрсетілген.

Егер  MPI- мен қолданылатын базалық тілде қосымша деректер типі бар болса, онда сәйкес типтер MPI- да да қамтамасыз етілуі керек. Алдын  –ала анықталған деректер типі атауларының  толық тізімі mpif.h (mpi.h) файлында саналған.

Хабарламаны қайта жіберу кезінде жоқ процесс үшін MPI_PROC_NULL арнайы мәнін қолдануға болады. Мұндай процессті операциялар MPI_SUCCESS аяқталу кодымен тез түрде аяқталуы керек. Мысалы, бірден үлкен нөмірі бар процесске хабарламаны қайта жіберу үшін келесі фрагментті қолдануға болады:

call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)

call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)

next = rank+1

if(next .eq. size) next = MPI_PROC_NULL

call MPI_SEND(buf, 1, MPI_REAL, next,

& 5, MPI_COMM_WORLD, ierr)

 

Бұл жағдайда соңғы нөмірлі  процесс деректердің шын жіберу мүмкіндігін орындамайды, керісінше  программаны ары қарай орындауға  кіріседі.

Блоктау процедурадан қайтарылғаннан кейін барлық параметрлердің қолдануының  қайталануының дұрыстығына кепілдік береді. MPI_SEND- тен қайтарылғаннан кейін жіберіліп жатқан хабарламаның құртылмауына қорықпай берілген процедураның шақыруындағы айнымалылырды қолдануға болады. Бұл кепілдіктің орындалуын таңдау тәсілі: аралық буферге көшіру немесе DEST процессіне керекті жіберу MPI жүзеге асуын өңдейтіндердің қолында болады.

     MPI_SEND процедурасынан қайтару хабарлама DEST процессінен алынғанын немесе берілген шақыру орындалатын процесс жүзеге асатын процессорлық элемент хабарламаны тастап кетуін санамайтынын айтып кеткен жөн. Берілген процедураның шақыруында қолданатын айнымалылардың қауіпсіз өзгеруінің кепілі қана беріледі. Мұндай анықталмағандық қолданушыға әрқашан да ұнамауы мүмкін.  Хабарлама жіберудің мүмкіндіктерін кеңейту үшін MPI- да қосымша үш процедура енгізілген. Бұл процедуралардың параметрлері MPI_SEND- тікі сияқты, бірақ әрқайсысының өз ерекшелігі бар.

MPI_RECV(BUF, COUNT, DATATYPE, SOURCE, MSTAG, COMM, STATUS, IERR)

<type> BUF (*)

INTEGER COUNT, DATATYPE, SOURCE, MSTAG, COMM, IERR,

STATUS (MPI_STATUS_SIZE)

DATATYPE типті COUNT хабар элементтерін BUF буферіне блоктау қабылдау. Егер нақты қабылданған элементтердің саны COUNT мәнінен аз болса, онда BUF буферінде тек қана қабылданған хабардың элементтеріне сәйкес болатын элементтер өзгереді. Егер қабылданатын хабардың элементтер саны COUNT мәнінен көп болса, онда толып кету қатесі пайда болады. Осыған жеткізбеу үшін біріншіден MPI_PROBE (MPI_IPROBE) процедурасы көмегімен қабылданатын хабардың құрылымын анықтау керек. Егер қабылданатын хабардың элементтерінің нақты санын анықтау керек болса, онда MPI_GET_COUNT процедурасын пайдалануға болады. Блоктау(блокировка) мынаған кепілдік береді: барлық хабарлар элементтері MPI_RECV процедурасынан қайтқаннан кейін BUF буферінде қабылданады және орналасады.

 

Төменде нөлдік процесс бір  нөмірлі процесске хабар жіберіп  және одан жауап күтетін  программаның мысалы келтірілген. Егер программа  көп процесс арқылы іске қосылған болса, онда қайта жіберілулерді  нақты түрде тек қана нөлінші  және бірінші процесстер орындайды. Қалған процестер MPI_INIT процедурасы арқылы инилизациялаудан кейін a және b айнымалылардың бастапқы шарттарын теріп шығады, бұдан кейін олар MPI_FINALIZE процедурасын орындап аяқталады.

Қойылған есепті параллельдеу үшін келесі алгоритмді қолданамыз:



                          


 Пр1(0,m+1)       Пр2(0,m+1)

Тізбектей және параллель  алгоритмнің нәтижесі

 

 

Сурет 3.1. Қысымның тізбектей бағдарлама арқылы алынған графигі

 

Сурет 3.2. Өтімділік коэффициенті тізбектей бағдарлама арқылы алынған графигі

 

Сурет 3.3. Қысымның параллель алгоритм бойынша алынған графигі

 

 

 

 

 

 

 

 

 

 

 

 

Қорытынды

Қазіргі кезде мұнай өндіру саласында скважинаға суды айдау  процесі, оның математикалық модельденуі  және сандық әдістермен шешілуі өте  маңызды роль атқарады. Біз алдын  ала сандық әдістермен судың пласттағы  жайылу процесі мен өндіруші скважинаға жету уақытын көрсету мұнай өндіру дебитін көтеруге пайдасын тигізеді. Өйткені, баспа скважинасынан айдалған судың өндіруші скважинаға жеткен уақытында  өндіруші скважинадағы мұнай дебиті шұғыл төмендеп кетеді және су мұнайға  қарағанда көбірек шығады. Яғни бұл  процесті ары қарай жалғастыра беретін  болсақ бұл экономикалық жағынан  тиімсіз болады.

Жоғарыда қарастырылған  фазалардың қысымдары бірдей деп  саналатын араласпайтын ығыстыру Баклей-Леверетт схемасы екіфазалық сұйықтардың  фильтрация теориясындағы ең қарапайымы болып табылады. Бұл модельде қозғалыстағы араласпайтын сұйық фазалардың шекараларындағы  капиллярлық қысым өзгерісінің  болмауы туралы қабылданған жорамал  негізгі дифференциалдық теңдеулер  жүйесінің ретін бірге төмендету  арқылы жеңілдетуге мүмкіндік береді.

 

 

 

 

 

 

 

 

 

 

 

 

ҚОЛДАНЫЛҒАН ӘДЕБИЕТТЕР

  1. Маскет М. Течение однородных жидкостей в пористой среде. – М. – Л.: Гостоптехиздат, 1949. – 628 с.
  2. Шейдеггер А.Э. Физика течения жидкостей через пористые среды: Пер. с англ. – М.: Гостоптехиздат, 1960. – 249с.
  3. Баренблатт Г. И., Ентов В. М., Рыжик В.М. Движение жидкостей и газов в природных пластах. – М.: Недра, 1984. – 207с.
  4. Данаев Н.Т., Корсакова Н. К., Пеньковский В. И. Массаперенос в прискважинной зоне и электромагитный каротаж пластов. – Алматы: Қазақ университеті, 2005. – 200с.
  5. Бакирова М. И., Зембеков Н. А., Карпов В.Я. Метод моделирования задачи фильтрации со скачком насыщенности.  Институт математического моделирования РАН
  6. OMAR KALIFA HAMMUDA ALUHWAL.  SIMULATION STUDY OF IMPROVING OIL RECOVERY BY POLYMER FLOODING IN A MALAYSIAN RESERVOIR
  7. Д.А. Беликов, И.В. Говязов, Е.А. Данилкин, В.И. Лаева, С.А. Проханов,А.В. Старченко.В 93 Высокопроизводительные вычисления на кластерах: Учебн. пособие/Под ред. А.В. Старченко. – Томск: Изд-во Том. ун-та, 2008. – 198 с.ISBN 978-5-7511-1879-2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Қосымша

 Java тілінде жазылған тізбектей код бір өлшемді үшін

import java.io.*;

 

import mpi.*;

import utils.*;

 

public class Main {

 

public static void main(String[] args) throws Exception {

// TODO Auto-generated method stub

MPI.Init(args);

int rank = MPI.COMM_WORLD.Rank();

int size = MPI.COMM_WORLD.Size();

 

if (rank==0) {

System.out.println("rank= " + rank);

int m,i,itr;

m=100;

//System.out.println("S= " + s);

double[] pold = new double[m + 2];

double[] pnew = new double[m + 2];

double[] fm = new double[m + 2];

double[] km = new double[m + 2];

double[] ko = new double[m + 2];

double[] pd = new double[m + 2];

double[] pnag = new double[m + 2];

double[] lqsk = new double[m + 2];

double[] qsk = new double[m + 2];

double diffnorm, gdiffnorm, eps, sdiffnorm, sgdiffnorm;

double h1,tau;

double f1,f2,mu1,mu2,rc;

boolean converged;

int ii, rp;

String no, name;

 

h1 = 1. / m; eps = 0.01;

f1=0.1; f2=8;

mu1=1; mu2=10;

 

tau = (double) ((Math.pow(h1, 2)) * 0.5*0.01);

 

for (i = 0; i <= (m + 1); i++) {

pold[i] = 0.4;

fm[i] = 0.;

pnew[i] = pold[i];

}

 

for (i = 0; i <= (m + 1); i++) {

qsk[i] = 0.0;

lqsk[i] = 0.0;

pd[i] = 0.0;

pnag[i] = 0.0;

}

 

pnag[25] = 1.0;

lqsk[25] = 1.0;

 

pd[75] = 1.0;

lqsk[75] = -1.0;

 

 

rc = h1 * 0.5;

 

itr = 0;

 

do {

 

for (i = 0; i <= (m + 1); i++) {

 ko[i]=0.5+0.1*Math.sin(2*3.14*i*h1);

         km[i]=ko[i]*(f1/mu1)+ko[i]*(f2/mu2);

 

}

 

           for (i = 0; i <= (m+1); i++) {

qsk[i] = lqsk[i]*(-pnag[i] - pd[i])*(2 * 3.14 * km[i] / ((double)                     (Math.log(0.2 * h1 / rc))));

fm[i] = qsk[i]; // !!

 

}

 

 

 

 

/////*******************

int k = 0;

int itcnt = 0;

do {

k = k + 1;

diffnorm = 0.0;

 

itcnt = itcnt + 1;

//

//

 

double s1 = 0.f;

double s2 = 0.f;

//

           /// proneciamost'

 

for(i = 1; i <= m; i++) {

 

s1 = 0.5 * (km[i + 1] + km[i]);

s2 = 0.5 * (km[i - 1] + km[i]);

pnew[i] = (s2 * pold[i - 1] + s1 * pold[i + 1]+ h1*h1*fm[i])/ (s1 + s2);

diffnorm = (diffnorm + ((double) Math.pow(((pnew[i] - pold[i])), 2)));

 

}

 

for (i = 1; i <= (m); i++) {

 

pold[i] = pnew[i];

 

}

///////////////shekaralik shart

 

 

 

 

gdiffnorm = (diffnorm);

 

 

gdiffnorm = (double) Math.sqrt((double) gdiffnorm);

converged = (gdiffnorm < eps);

 

System.out.println("pk=" + k);

} while (gdiffnorm > eps);

///*********************

 

//pold[0]=0.4;

//pold[m+1]=0.4;

pold[0]=pold[1]; //0.4;

pold[m+1]=pold[m];  //0.4;

 

for (i = 1; i <= (m ); i++) {

System.out.println("itr="+itr +";pold[" +i +"]=" + pold[i]);

//System.out.println(pold[i]);

}

 

if (itr%10==0) {

no = file_no(itr);

name = "P".concat(no);

name = name.concat(".dat");

 

FileOutputStream fout1 = new FileOutputStream(name);

PrintStream out = new PrintStream(fout1);

//out.println("TITLE = \"Example: Simple 2D-Volume Data\"");

out.println("X\", \"P\", \"km\"");

//out.println("ZONE I=" + (m) + ", F=POINT");

 

 

for (i = 1; i <= m; i++) {

 

out.println((float) i + " " +pold[i] + " " +km[i]);

 

}

 

fout1.close();

}

 

itr = itr + 1;

} while (itr <= 100); // itr

}

//System.out.println("Hi from " + rank);

 

MPI.Finalize();

}

public static String file_no(int ii) {

char[] c = new char[10];

String c1, no;

c[0] = '0';

c[1] = '1';

c[2] = '2';

c[3] = '3';

c[4] = '4';

c[5] = '5';

c[6] = '6';

c[7] = '7';

c[8] = '8';

c[9] = '9';

if (ii < 10) {

no = "000";

c1 = Character.toString(c[ii]);

no = no.concat(c1);

} else if (ii < 100) {

no = "00";

c1 = Character.toString(c[ii / 10]);

no = no.concat(c1);

c1 = Character.toString(c[ii % 10]);

no = no.concat(c1);

} else if (ii < 1000) {

no = "0";

c1 = Character.toString(c[ii / 100]);

no = no.concat(c1);

c1 = Character.toString(c[(ii % 100) / 10]);

no = no.concat(c1);

c1 = Character.toString(c[ii % 10]);

no = no.concat(c1);

} else {

no = Character.toString(c[ii / 1000]);

c1 = Character.toString(c[(ii % 1000) / 100]);

no = no.concat(c1);

c1 = Character.toString(c[(ii % 100) / 10]);

no = no.concat(c1);

c1 = Character.toString(c[ii % 10]);

no = no.concat(c1);

}

return no;

}

 

}

 

Параллеьдеу алгоритмі

 

 

import java.io.*;

 

import mpi.*;

import utils.*;

 

public class Main {

 

public static void main(String[] args) throws Exception {

// TODO Auto-generated method stub

int m,i,itr,n;

m=100;

//n=100;

//System.out.println("S= " + s);

double[] pold = new double[m + 2];

double[] pnew = new double[m + 2];

double[] fm = new double[m + 2];

double[] km = new double[m + 2];

double[] ko = new double[m + 2];

double[] pd = new double[m + 2];

double[] pnag = new double[m + 2];

double[] lqsk = new double[m + 2];

double[] qsk = new double[m + 2];

double diffnorm, gdiffnorm, eps, sdiffnorm, sgdiffnorm;

double h1,tau;

Информация о работе Пласт сұйық ағымының есебiн параллельдеу бойынша алгоритмін құру. (полимерді пайдалану)