Автор работы: Пользователь скрыл имя, 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
Осы топтардағы барлық процедуралар
екі топқа бөлінеді: блокталған процедура(синхрондалған)
және блокталмаған(асинхрондалған).
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- тікі сияқты, бірақ әрқайсысының өз ерекшелігі бар.
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 буферінде қабылданады және орналасады.
Төменде нөлдік процесс бір
нөмірлі процесске хабар
Қойылған есепті параллельдеу үшін келесі алгоритмді қолданамыз:
Пр1(0,m+1) Пр2(0,m+1)
Тізбектей және параллель алгоритмнің нәтижесі
Сурет 3.1. Қысымның тізбектей бағдарлама арқылы алынған графигі
Сурет 3.2. Өтімділік коэффициенті тізбектей бағдарлама арқылы алынған графигі
Сурет 3.3. Қысымның параллель алгоритм бойынша алынған графигі
Қазіргі кезде мұнай өндіру саласында скважинаға суды айдау процесі, оның математикалық модельденуі және сандық әдістермен шешілуі өте маңызды роль атқарады. Біз алдын ала сандық әдістермен судың пласттағы жайылу процесі мен өндіруші скважинаға жету уақытын көрсету мұнай өндіру дебитін көтеруге пайдасын тигізеді. Өйткені, баспа скважинасынан айдалған судың өндіруші скважинаға жеткен уақытында өндіруші скважинадағы мұнай дебиті шұғыл төмендеп кетеді және су мұнайға қарағанда көбірек шығады. Яғни бұл процесті ары қарай жалғастыра беретін болсақ бұл экономикалық жағынан тиімсіз болады.
Жоғарыда қарастырылған
фазалардың қысымдары бірдей деп
саналатын араласпайтын ығыстыру Баклей-Леверетт
схемасы екіфазалық сұйықтардың
фильтрация теориясындағы ең қарапайымы
болып табылады. Бұл модельде қозғалыстағы
араласпайтын сұйық фазалардың шекараларындағы
капиллярлық қысым өзгерісінің
болмауы туралы қабылданған жорамал
негізгі дифференциалдық
Қосымша
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.
km[i]=ko[i]*(f1/mu1)+ko[i]*(
}
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;