Advertisement
mirosh111000

Мірошниченко_Артем_ПМ-11_Лр№8_Мет_комп_експ

May 28th, 2024
705
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.06 KB | None | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from IPython.display import Latex
  4. import random
  5.  
  6. def my_time_(s):
  7.     h = s // 3600
  8.     time = s % 3600
  9.     m = time // 60
  10.     s = time % 60
  11.     if h < 10:
  12.         h = '0' + str(int(h))
  13.     if m < 10:
  14.         m = '0' + str(int(m))
  15.     if s < 10:
  16.         s = '0' + str(int(s))
  17.    
  18.     return fr'{h}:{m}:{s}'
  19.        
  20. def to_latex(text=''): return fr'${text}$'
  21.  
  22. def d2f_dc2(c, a):
  23.     return 2 * (-a * c + 1)**2 - 8 * c * (-a * c + 1) * a + 2 * c**2 * a**2
  24.  
  25. def f(c, a):
  26.     return c**2 * (1 - a*c)**2
  27.  
  28. def stability_index(k, c, a, z):
  29.     return -M * k**2 * d2f_dc2(c, a) * (c - M*z*k**4)
  30.  
  31.  
  32.  
  33. M = 1
  34. a = 1
  35. z = 0.5
  36. c0 = 0.5
  37.  
  38. k_values = np.linspace(0, 1.2, 100)
  39. lambda_values = []
  40.  
  41. for k in k_values:
  42.     lambda_val = stability_index(k, c0, a, z)
  43.     lambda_values.append(lambda_val)
  44.  
  45. plt.figure(figsize=(9, 5))
  46. plt.plot(k_values, lambda_values)
  47. plt.xlabel(to_latex('k'))
  48. plt.ylabel(to_latex('λ'))
  49. plt.title(to_latex('Залежність\ λ(k)'))
  50. plt.grid(True)
  51. plt.show()
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61. M = 1
  62. z = 0.5
  63. k_values = np.linspace(0, 1.2, 200)
  64.  
  65. a_values = np.linspace(0.1, 2, 200)
  66. c0_values = np.linspace(0.1, 1, 200)
  67.  
  68. stability_results = np.zeros((len(a_values), len(c0_values)))
  69.  
  70. def d2f_dc2(c, a):
  71.     return 2 * (-a * c + 1)**2 - 8 * c * (-a * c + 1) * a + 2 * c**2 * a**2
  72.  
  73. def stability_index(k, c, a, z):
  74.     return -M * k**2 * d2f_dc2(c, a) - M * z * k**4
  75.  
  76. for i, a in enumerate(a_values):
  77.     for j, c0 in enumerate(c0_values):
  78.         lambda_values = []
  79.         for k in k_values:
  80.             lambda_val = stability_index(k, c0, a, z)
  81.             if lambda_val > 0:
  82.                 lambda_values.append(lambda_val)
  83.             else:
  84.                 lambda_values.append(np.nan)
  85.         stability_results[i, j] = np.nanmean(lambda_values)
  86.  
  87. plt.figure(figsize=(9, 5))
  88. plt.imshow(stability_results, extent=[min(c0_values), max(c0_values), min(a_values), max(a_values)], origin='lower', aspect='auto', cmap='magma')
  89. plt.colorbar(label=to_latex('λ'))
  90. plt.xlabel(to_latex('c_0'))
  91. plt.ylabel(to_latex('a'))
  92. plt.title(to_latex('Діаграма\ стійкості\ a(c_0)'))
  93. plt.show()
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103. def micro_ch_pre(Nx, Ny, co, iflag):
  104.     np.random.seed(0)
  105.     noise = 0.02
  106.     con = np.zeros((Nx, Ny))
  107.     if iflag == 1:
  108.         for i in range(Nx):
  109.             for j in range(Ny):
  110.                 con[i, j] = co + noise * (0.5 - random.random())
  111.     else:
  112.         for i in range(Nx):
  113.             for j in range(Ny):
  114.                 ii = (i - 1) * Nx + j
  115.                 con[ii] = co + noise * (0.5 - random.random())
  116.     return con
  117.  
  118. # Parameters
  119. Nx = 64
  120. Ny = 64
  121. dx = 1.0
  122. dy = 1.0
  123. nstep = 10000
  124. nprint = 50
  125. dtime = 1.0e-2
  126. ttime = 0.0
  127. co = 0.40
  128. mobility = 1.0
  129. grad_coef = 0.5
  130.  
  131. # Prepare microstructure
  132. iflag = 1
  133. con = micro_ch_pre(Nx, Ny, co, iflag)
  134.  
  135. lap_con = np.zeros((Nx, Ny))
  136. lap_dummy = np.zeros((Nx, Ny))
  137. dummy = np.zeros((Nx, Ny))
  138.  
  139. # Time and concentration arrays for plotting
  140. time_vals = []
  141. concentration_vals = []
  142.  
  143. con_images = []
  144. step_list = []
  145. # Evolve
  146. for istep in range(1, nstep + 1):
  147.     ttime += dtime
  148.     for i in range(Nx):
  149.         for j in range(Ny):
  150.             jp = j + 1 if j + 1 < Ny else 0
  151.             jm = j - 1 if j - 1 >= 0 else Ny - 1
  152.             ip = i + 1 if i + 1 < Nx else 0
  153.             im = i - 1 if i - 1 >= 0 else Nx - 1
  154.  
  155.             hne = con[ip, j]
  156.             hnw = con[im, j]
  157.             hns = con[i, jm]
  158.             hnn = con[i, jp]
  159.             hnc = con[i, j]
  160.  
  161.             lap_con_ij = (hnw + hne + hns + hnn - 4 * hnc) / (dx * dy)
  162.  
  163.             dfdcon = 2 * (con[i, j] * (1 - con[i, j])**2 - 2 * con[i, j]**2 * (1 - con[i, j]))
  164.             dummy[i, j] = dfdcon - grad_coef * lap_con_ij
  165.  
  166.     for i in range(Nx):
  167.         for j in range(Ny):
  168.             jp = j + 1 if j + 1 < Ny else 0
  169.             jm = j - 1 if j - 1 >= 0 else Ny - 1
  170.             ip = i + 1 if i + 1 < Nx else 0
  171.             im = i - 1 if i - 1 >= 0 else Nx - 1
  172.  
  173.             hne = dummy[ip, j]
  174.             hnw = dummy[im, j]
  175.             hns = dummy[i, jm]
  176.             hnn = dummy[i, jp]
  177.             hnc = dummy[i, j]
  178.  
  179.             lap_dummy[i, j] = (hnw + hne + hns + hnn - 4 * hnc) / (dx * dy)
  180.  
  181.             con[i, j] = con[i, j] + dtime * mobility * lap_dummy[i, j]
  182.  
  183.             if con[i, j] >= 0.9999:
  184.                 con[i, j] = 0.9999
  185.             if con[i, j] < 0.00001:
  186.                 con[i, j] = 0.00001
  187.  
  188.     if istep % nprint == 0 or istep == 1:
  189.         print(f"done step: {istep}")
  190.         time_vals.append(ttime)
  191.         concentration_vals.append(con.copy())
  192.  
  193.         if istep in [1, 100, 1000, 2500, 5000, 10000]:
  194.             con_images.append(np.copy(con))
  195.             step_list.append(round(ttime, 4))
  196.  
  197.  
  198. fig, axes = plt.subplots(2, 3, figsize=(15, 10))
  199. axes = axes.ravel()
  200.  
  201. for i in range(len(con_images)):
  202.     im = axes[i].imshow(con_images[i], cmap='coolwarm')
  203.     axes[i].set_title(to_latex(f'Time: \ {step_list[i]}'))
  204.     plt.colorbar(im, ax=axes[i])
  205.     axes[i].axis('off')
  206.                          
  207. plt.tight_layout()
  208. plt.show()
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218. def micro_ch_pre(Nx, Ny, co, iflag):
  219.     np.random.seed(0)
  220.     noise = 0.02
  221.     con = np.zeros((Nx, Ny))
  222.     if iflag == 1:
  223.         for i in range(Nx):
  224.             for j in range(Ny):
  225.                 con[i, j] = co + noise * (0.5 - random.random())
  226.     else:
  227.         for i in range(Nx):
  228.             for j in range(Ny):
  229.                 ii = (i - 1) * Nx + j
  230.                 con[ii] = co + noise * (0.5 - random.random())
  231.     return con
  232.  
  233. # Parameters
  234. Nx = 64
  235. Ny = 64
  236. dx = 1.0
  237. dy = 1.0
  238. nstep = 1000
  239. nprint = 50
  240. dtime = 1.0e-2
  241. ttime = 0.0
  242. co = 0.40
  243. mobility = 1.0
  244. grad_coef = 0.5
  245.  
  246. # Prepare microstructure
  247. iflag = 1
  248. con = micro_ch_pre(Nx, Ny, co, iflag)
  249.  
  250. lap_con = np.zeros((Nx, Ny))
  251. lap_dummy = np.zeros((Nx, Ny))
  252. dummy = np.zeros((Nx, Ny))
  253.  
  254. # Time and concentration arrays for plotting
  255. time_vals = []
  256. concentration_vals = []
  257. diff_history = []
  258.  
  259. # Evolve
  260. for istep in range(1, nstep + 1):
  261.     ttime += dtime
  262.     for i in range(Nx):
  263.         for j in range(Ny):
  264.             jp = j + 1 if j + 1 < Ny else 0
  265.             jm = j - 1 if j - 1 >= 0 else Ny - 1
  266.             ip = i + 1 if i + 1 < Nx else 0
  267.             im = i - 1 if i - 1 >= 0 else Nx - 1
  268.  
  269.             hne = con[ip, j]
  270.             hnw = con[im, j]
  271.             hns = con[i, jm]
  272.             hnn = con[i, jp]
  273.             hnc = con[i, j]
  274.  
  275.             lap_con_ij = (hnw + hne + hns + hnn - 4 * hnc) / (dx * dy)
  276.  
  277.             dfdcon = 2 * (con[i, j] * (1 - con[i, j])**2 - 2 * con[i, j]**2 * (1 - con[i, j]))
  278.             dummy[i, j] = dfdcon - grad_coef * lap_con_ij
  279.  
  280.     for i in range(Nx):
  281.         for j in range(Ny):
  282.             jp = j + 1 if j + 1 < Ny else 0
  283.             jm = j - 1 if j - 1 >= 0 else Ny - 1
  284.             ip = i + 1 if i + 1 < Nx else 0
  285.             im = i - 1 if i - 1 >= 0 else Nx - 1
  286.  
  287.             hne = dummy[ip, j]
  288.             hnw = dummy[im, j]
  289.             hns = dummy[i, jm]
  290.             hnn = dummy[i, jp]
  291.             hnc = dummy[i, j]
  292.  
  293.             lap_dummy[i, j] = (hnw + hne + hns + hnn - 4 * hnc) / (dx * dy)
  294.  
  295.             con[i, j] = con[i, j] + dtime * mobility * lap_dummy[i, j]
  296.  
  297.             if con[i, j] >= 0.9999:
  298.                 con[i, j] = 0.9999
  299.             if con[i, j] < 0.00001:
  300.                 con[i, j] = 0.00001
  301.  
  302.     if istep % nprint == 0 or istep == 1:
  303.         print(f"done step: {istep}")
  304.         average_temp = np.mean(con)
  305.         concentration_vals.append(average_temp)
  306.         time_vals.append(ttime)
  307.         diff = np.mean(con**2) - np.mean(con)**2
  308.         diff_history.append(diff)
  309.  
  310. # Plot Average Concentration vs. Time
  311. plt.figure(figsize=(9, 5))
  312. plt.plot(time_vals, concentration_vals)
  313. plt.xlim(0, 5)
  314. plt.xlabel(to_latex("Time"))
  315. plt.ylabel(to_latex("Average\ Concentration"))
  316. plt.title(to_latex("Average\ Concentration vs \ Time"))
  317. plt.grid(True)
  318. plt.show()
  319.  
  320. # Plot <c**2> - <c>**2 vs. Time
  321. plt.figure(figsize=(9, 5))
  322. plt.plot(time_vals, diff_history)
  323. plt.xlabel(to_latex("Time"))
  324. plt.ylabel(to_latex("<c^2> - <c>^2"))
  325. plt.title(to_latex("<c^2> - <c>^2 \ vs\ Time"))
  326. plt.grid(True)
  327. plt.show()
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338. # Задані параметри
  339. M = 1
  340. z = 0.5
  341. k_values = np.linspace(0, 1.2, 200)
  342.  
  343. # Генерація значень a та c0
  344. a_values1 = np.array([0.4, 0.6, 0.8, 1.2, 1.4, 1.6, 0.5, 1.0, 1.5, 1.0, 1.0])
  345. c0_values1 = np.array([0.2, 0.3, 0.4, 0.6, 0.7, 0.8, 0.5, 0.5, 0.5, 0.3, 0.7])
  346.  
  347.  
  348. # Генерація значень a та c0
  349. a_values = np.linspace(0.1, 2, 200)
  350. c0_values = np.linspace(0.1, 1, 200)
  351.  
  352. # Створення масиву для результатів
  353. stability_results = np.zeros((len(a_values), len(c0_values)))
  354.  
  355. # Визначення функції d2f_dc2
  356. def d2f_dc2(c, a):
  357.     return 2 * (-a * c + 1)**2 - 8 * c * (-a * c + 1) * a + 2 * c**2 * a**2
  358.  
  359. # Визначення функції f(c, a)
  360. def f(c, a):
  361.     return c**2 * (1 - a * c)**2
  362.  
  363. # Визначення показника стійкості lambda
  364. def stability_index(k, c, a, z):
  365.     return -M * k**2 * d2f_dc2(c, a) - M * z * k**4
  366.  
  367. # Побудова діаграми стійкості
  368. for i, a in enumerate(a_values):
  369.     for j, c0 in enumerate(c0_values):
  370.         lambda_values = []
  371.         for k in k_values:
  372.             lambda_val = stability_index(k, c0, a, z)
  373.             if lambda_val > 0:
  374.                 lambda_values.append(lambda_val)
  375.             else:
  376.                 lambda_values.append(np.nan)
  377.         stability_results[i, j] = np.nanmean(lambda_values)
  378.  
  379. # Побудова графіка
  380. plt.figure(figsize=(9, 5))
  381. plt.imshow(stability_results, extent=[min(c0_values), max(c0_values), min(a_values), max(a_values)], origin='lower', aspect='auto', cmap='magma')
  382. plt.colorbar(label=to_latex('λ'))
  383. plt.xlabel(to_latex('c_0'))
  384. plt.scatter(c0_values1, a_values1, color='red')
  385. plt.ylabel(to_latex('a'))
  386. plt.title(to_latex('Діаграма\ стійкості\ a(c_0)'))
  387. plt.show()
  388.  
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397. def micro_ch_pre(Nx, Ny, co, iflag):
  398.     np.random.seed(0)
  399.     noise = 0.02
  400.     con = np.zeros((Nx, Ny))
  401.     if iflag == 1:
  402.         for i in range(Nx):
  403.             for j in range(Ny):
  404.                 con[i, j] = co + noise * (0.5 - random.random())
  405.     else:
  406.         for i in range(Nx):
  407.             for j in range(Ny):
  408.                 ii = (i - 1) * Nx + j
  409.                 con[ii] = co + noise * (0.5 - random.random())
  410.     return con
  411.  
  412. # Parameters
  413. Nx = 64
  414. Ny = 64
  415. dx = 1.0
  416. dy = 1.0
  417. nstep = 25000
  418. nprint = 50
  419. dtime = 1.0e-2
  420. ttime = 0.0
  421. mobility = 1.0
  422. grad_coef = 0.5
  423.  
  424. # Values to iterate over
  425. a_values = np.array([0.4, 0.6, 0.8, 1.2, 1.4, 1.6, 0.5, 1.0, 1.5, 1.0, 1.0])
  426. co_values = np.array([0.2, 0.3, 0.4, 0.6, 0.7, 0.8, 0.5, 0.5, 0.5, 0.3, 0.7])
  427.  
  428. for a, co in zip(a_values, co_values):
  429.     print(f"\n\nRunning for a = {a} and co = {co}\n\n")
  430.     ttime = 0
  431.     con = micro_ch_pre(Nx, Ny, co, iflag=1)
  432.  
  433.     lap_con = np.zeros((Nx, Ny))
  434.     lap_dummy = np.zeros((Nx, Ny))
  435.     dummy = np.zeros((Nx, Ny))
  436.  
  437.     # Time and concentration arrays for plotting
  438.     time_vals = []
  439.     concentration_vals = []
  440.  
  441.     # Evolve
  442.     for istep in range(1, nstep + 1):
  443.         ttime += dtime
  444.         for i in range(Nx):
  445.             for j in range(Ny):
  446.                 jp = j + 1 if j + 1 < Ny else 0
  447.                 jm = j - 1 if j - 1 >= 0 else Ny - 1
  448.                 ip = i + 1 if i + 1 < Nx else 0
  449.                 im = i - 1 if i - 1 >= 0 else Nx - 1
  450.  
  451.                 hne = con[ip, j]
  452.                 hnw = con[im, j]
  453.                 hns = con[i, jm]
  454.                 hnn = con[i, jp]
  455.                 hnc = con[i, j]
  456.  
  457.                 lap_con_ij = (hnw + hne + hns + hnn - 4 * hnc) / (dx * dy)
  458.  
  459.                 dfdcon =  2*con[i, j]*(-a*con[i, j]+1)**2-2*((con[i, j])**2)*(-a*con[i, j]+1)*a
  460.                 dummy[i, j] = dfdcon - grad_coef * lap_con_ij
  461.  
  462.         for i in range(Nx):
  463.             for j in range(Ny):
  464.                 jp = j + 1 if j + 1 < Ny else 0
  465.                 jm = j - 1 if j - 1 >= 0 else Ny - 1
  466.                 ip = i + 1 if i + 1 < Nx else 0
  467.                 im = i - 1 if i - 1 >= 0 else Nx - 1
  468.  
  469.                 hne = dummy[ip, j]
  470.                 hnw = dummy[im, j]
  471.                 hns = dummy[i, jm]
  472.                 hnn = dummy[i, jp]
  473.                 hnc = dummy[i, j]
  474.  
  475.                 lap_dummy[i, j] = (hnw + hne + hns + hnn - 4 * hnc) / (dx * dy)
  476.  
  477.                 con[i, j] = con[i, j] + dtime * mobility * lap_dummy[i, j]
  478.  
  479.                 if con[i, j] >= 0.9999:
  480.                     con[i, j] = 0.9999
  481.                 if con[i, j] < 0.00001:
  482.                     con[i, j] = 0.00001
  483.  
  484.         if istep % nprint == 0 or istep == 1:
  485.             if istep % 5000 == 0:
  486.                 print(f"done step: {istep}")
  487.             time_vals.append(ttime)
  488.             concentration_vals.append(con.copy())
  489.            
  490.             if istep == nstep:
  491.                 plt.figure(figsize=(9, 5))
  492.                 plt.imshow(con, cmap='coolwarm')
  493.                 plt.colorbar()
  494.                 plt.title(to_latex(f"a={a},\ c_0={co},\ Time: {round(ttime, 4)}"))
  495.                 plt.show()
  496.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement