Welcome Message

「流行起於高分子,變化盡藏微宇宙」! 歡迎光臨「流變學好簡單 | The RheoMaster」部落格,成立於 2019/2/22,旨在提供簡單的中文流變學知識,包括高分子流變學、輸送現象、高分子加工、流變量測等。您可至右方進行關鍵字搜尋,若有任何建議,請至文章留言或來信 yuhowen@gmail.com。 Welcome to "The RheoMaster" Blog. This website was established in Feb 2019. In view of the lack of Chinese literature on rheology, here we offer basic knowledge relevant to polymer rheology, transport phenomena, polymer processing, rheometry, etc. If you have any suggestion, please leave a message on the post you are reading or email us at yuhowen@gmail.com.

2019年12月15日

Chapter 8 More on Classes

第 8 章基本 C++ 程式碼整理如下

Reference: I Horton, Ivor Horton's Beginning Visual C++ 2013 (Wiley 2014).


8.1 Class Destructors

∎ Simple destructor
// Destructor definition
CBox::~CBox()
{
    cout << "Destructor called." << endl;
}

∎ Dynamic memory allocation

// Constructor definition
CMessage::CMessage(const char* text = "Default message")
{
    cout << "Constructor called." << endl;
    size_t length {strlen(text) + 1};
    m_pMessage = new char [length];
    strcpy_s (m_pMessage, length, text); 


// Destructor to free memory allocated by new

CMessage::~CMessage()
{
    cout << "Destructor called." << endl;
    delete [] m_pMessage;
}


8.2 Implementing a Copy Constructor

∎ Copy constructor (different from a default copy constructor)  // Constructor definition
CMessage::CMessage(const CMessage& aMess)
{
    size_t length {strlen(aMess.m_pMessage) + 1};
    m_pMessage = new char [length];
    strcpy_s(m_pMessage, length, aMess.m_pMessage);
}


8.3 Operator Overloading
∎ Operator functions
// Main.cpp
if (mediumBox < bigBox)
    cout << "mediumBox < bigBox." << endl;
else
    cout << "mediumBox NOT < bigBox." << endl;

if (thatBox == mdeiumBox)

    cout << "thatBox = mediumBox." << endl;
else
    cout << "thatBox NOT = mediumBox." << endl;

if (mediumBox > 50.0)

    cout << "mediumBox capacity > 50." << endl;
else
    cout << "mediumBox capacity NOT > 50." << endl;

// Operator functions in CBox.cpp

bool CBox::operator<(const CBox& aBox) const
{
    return this->volume () < aBox.volume ();
}

bool CBox::operator==(const CBox& aBox) const

{
    return this->volume () == aBox.volume();
}

bool CBox::operator>(const double value) const

{
    return this->volume () > value;
}

∎ Overloaded assignment operator

// Overloaded assignment operator for CMessage objects
CMessage& CMessage::opeartor=(const CMessage& aMess)
{
    if (this != &aMess)
    {
        delete [] m_pMessage;
        size_t length {strlen(aMess.m_pMessage) + 1};
        m_pMessage = new char [length];
        strcpy_s(this->m_pMessage, length, aMess.m_pMessage);
    }
    return *this;
}

∎ Addition operator

// Function to add two CBox objects
CBox::CBox operator+(const CBox& aBox) const
{
    return CBox(std::max(m_length, aBox.m_length),
                          std::max(m_width, aBox.m_width),
                          m_height + aBox.m_height);
}


8.4 The Object Copying Problem

∎ Addition operator
// Main.cpp
motto3 = motto1 + motto2;

// Tracing object copy operations in CMessage.cpp

// Addition operator function (step 1)
CMessage::CMessage operator+(const CMessage& aMess) const
{
    cout << "Add operator function called." << endl;
    size_t length {strlen(m_pMessage) + strlen(aMess.m_pMessage) + 1};
    CMessage message;
    message.m_pMessage = new char [length];
    strcpy_s(message.m_pMessage, length, m_pMessage);
    strcat_s(message.m_pMessage, length, aMess.m_pMessage);
    return message;
}

// Copy constructor (step 2)

CMessage::CMessage(const CMessage& aMess)
{
    cout "Copy constructor called." << endl;
    size_t length {strlen(aMess.m_pMessage) + 1};
    m_pMessage = new char [length];
    strcpy_s(m_pMessage, length, aMess.m_pMessage);
}

// Assignment operator function (step 3)

CMessage& CMessage::operator=(const CMessage& aMess)
{
    cout << "Assignment operator function called." << endl;
    if  this != aMess)
    {
        delete [] m_pMessage;
        size_t length {strlen(aMess.m_pMessage) + 1};
        m_pMessage = new char [length];
        strcpy_s(this->m_pMessage, length, aMess.m_pMessage);
    } 
    return *this;
}

∎ Move constructor (cf. copy constructor)

CMessage:: CMessage(Cmessage&&aMess)
{
    cout << "Move constructor called." << endl;
    m_pMessage = aMess.m_pMessage;
    aMess.m_pMessage = nullptr; // Not const, so permitted
}

∎ Move assignment operator function (cf. assignment operator function)

CMessage& CMessage::operator=(CMessage&& aMess)
{
    cout << "Move assignment operator function called." << endl;
    delete [] m_pMessage;
    m_pMessage = aMess.m_pMessage;
    aMess.m_pMessage = nullptr;
    return *this;
}


8.5 Default Class Members


8.6 Class Templates


8.7 Perfect Forwarding


8.8 Default Arguments for Template Parameters


8.9 Aliases for Class Templates


8.10 Template Specialization


8.11 Using Classes


8.12 Organizing Your Program Code


8.13 Library Classes for Strings


8.14 Summary

2019年12月13日

書籍 - Ivor Horton's Beginning Visual C++ 2013

本書適合有志學好 C++,但又苦於尋找好的參考書的人! Ivor Horton 所寫的這本經典書,除了介紹基本的語法外,更討論了物件導向 (Object-Oriented Programming; OOP) 等進階的概念。本書另一特色是富含範例程式,帶領讀者一步步認識 C++ 的奧妙。

書中範例程式碼可於官網下載使用: http://www.wrox.com/WileyCDA/WroxTitle/Ivor-Horton-s-Beginning-Visual-C-2013.productCd-1118845714,descCd-DOWNLOAD.html
書本封面

目錄

2019年12月6日

典型形變之應力與應變關係 (Stress-Strain Relation for Typical Deformations)

本文介紹橡膠於剪切形變 (shear deformation) 和單軸拉伸形變 (uniaxial elongation) 的機械響應。

Figure 3.3

A. 剪切形變 (Shear Deformation)
首先,讓我們考慮如 Fig. 3.3b 所示的剪切形變。在此形變中,原本位在空間位置 (x, y, z) 的材料點 (material point) 被移位至
(1)
所以形變梯度張量為 (deformation gradient tensor)
(2)
因此,形變彈性能量 (elastic energy of deformation) 可透過下方通用式計算
(3)
可以得到
(4)
為了要計算剪切應力 σ,我們剪切應變由 γ 增加至 γ + dγ作功至每單位體積材料為 σdγ,此功將等於形變自由能密度的改變 df。因此剪切應力為
(5)
對於 Eq. 3,我們可以得到
(6)
因此剪切模數 G
(7)
如果 subchain 數目密度 nc (number density) 用交聯點 (cross-links) 之間的平均分子量 M表示,即 nρ/(Mx/NAv),其 ρ 是橡膠的密度,NAv 是亞佛加厥數 (Avogadro number)。因此,Eq. 7 可寫成
(8)
其中,RNAvkB 是氣體常數 (gas constant)。Equation 8 和理想氣體的體積彈性係數 (bulk modulus) 有相同的形式
(9)
其中,n 是氣體中的分子數目密度,M 是分子的分子量。由 Eqs. 8 和 9 可知,如果橡膠的 subchain 數目密度等於氣體的分子數目密度,則橡膠的剪切模數將等於氣體的體積彈性係數,這說明為何橡膠為何是軟的。對於氣體,因為密度 ρ 很小,所以體積彈性係數很小;對於橡膠,因為 M很大。只要高分子維持網狀結構,減少交聯密度可使 Mx 非常大,例如,當 Mx = 10(Da),G ≈ 0.25 MPa,這個值與空氣的體積彈性係數接近。理論上,我們可使彈性材料具有一個非常接近零的剪切模數。

B. 單軸拉伸 (Uniaxial Elongation)
接下來讓我們討論如 Fig. 3.3c 的拉伸形變 (elongational deformation)。如果一個不可壓縮材料在 z 方向被拉伸 λ 倍,為了保持固定體積,材料在 xy 方向會收縮 1/λ0.5 倍,因此形變梯度張量為 (deformation gradient tensor)
(10)
形變彈性能量為
(11)
考慮一個單位體積 (of unit volume) 之立方體橡膠樣品 (cubic sample of rubber),其於 z 方向被拉伸 λ 倍。σ(λ) 是這個形變的應力 (即每單位面積施加於垂直於 z 軸的樣品表面之力)。因為表面積變成 1/λ,施力於樣品表面的力為 σ(λ)/λ,而要將樣品進一步拉伸 dλ 作功 (σ(λ)/λ)dλ,若將此功等化自由能的變化 df,我們可得 (σ σzz)
(12)
若使用 Eq. 11,可得
(13)
對於小的形變 (small deformation),λ 可寫成 λ = 1 + ∈ (∈ << 1),故
(14)
因此,楊氏模數 E 為 3G,這是不可壓縮材料 (incompressible materials) 的通用結果 (general result)。

根據 Eq. 12,λ 隨著 σ 無限制增加,然而這對真實橡膠是不合理的,真實的橡膠無法被拉伸超過某個最大值 λmax,這是因為高分子之有限延展性 (finite extensibility)。根據自由連結鏈模型 (freely jointed chain model),一條 subchain 的最大末端距 (end-to-end distance) 為 Nb,因此,λmax = Nb/(N0.5b) = N0.5


以上,我們已經計算剪切、單軸拉伸兩種形變之應力 (特例),對於一個通用的形變 (general deformation),應力張量可透過 f(E) (Eq. 3) 計算,最後可得到通用式 (推導請見參考文獻附錄 A.4)
(15)
當 Eq. 15 與 Eq. 2 結合,可得剪切形變的應力表示式
σxy =      (16)
當 Eq. 15 與 Eq. 10 結合,可得單軸拉伸形變的應力表示式
σzz = G(λ2 - 1/λ)     (17)


Reference: M Doi, Soft Matter Physics (Oxford University Press 2013).

2019年12月2日

彈性軟物質 (Elastic Soft Matter)

Revised: 2022/3/10

彈性軟物質 (elastic soft matter) 對我們來說其實相當熟悉,例如日常生活的橡膠 (rubbers) 和凝膠 (gels),它們可以受小程度的變形而不破碎 (breaking);反觀,金屬 (metals) 和玻璃 (glasses) 則是典型的硬彈性材料 (hard elastic materials)。彈性軟物質是由網狀高分子 (network polymers) 所組成,如 Fig. 1.2c 所示。一般來說,橡膠不包含溶劑 (有時具小分子添加劑),且著重於機械性質 ;凝膠含有溶劑,且較著重於使流體保有彈性狀態。彈性軟物質的重要特徵是具有特定的形狀,當受外力時變形,外力移除後則回復原來形狀。反觀,液體 (liquids) 不具有特定形狀,可在沒有被作功的情況下變形。
Figure 1.2

A. 高分子和高分子凝膠 (Polymer Solutions and Polymer Gels)
Figure 3.1 圖示比較高分子的流體狀態 (fluid state),例如溶液,和彈性狀態 (elastic state),例如凝膠。高分子溶液屬於流體狀態,長鏈高分子彼此纏結形成黏滯材料,雖然其流動受阻,但仍會流動。的確,只要時間夠長,容器內的高分子溶液可以被倒至桌面。反觀,交聯的 (cross-linked) 高分子凝膠具有大的分子網狀結構 (molecular network),因此無法流動也無法被倒出。如果將容器倒置 (upside down),凝膠將掉出但是不會在桌面上攤平。簡單來說,流體可以無限制地被形變 (deformed indefinitely),而彈性材料在有限的形變下是可逆的 (reversibly deformed to a finite extent)。

Figure 3.1

B. 黏度和彈性 (Viscosity and Elasticity)
不論材料是流體還是彈性材料,均可透過 Fig. 3.2a 的實驗裝置進行研究。樣品被置於兩平行平板間,下板固定而上板水平移動並被一條線拉住。假設時間 t = 0,一個重量物質被懸吊於此線,然後於稍後的時間 tt0,這條線被剪斷。這樣的操作,可於時間 0 和 t間,施加一個固定的力 F 於上板。材料的機械性質可以用上板的位移行為 d(t) 表徵,如果材料是流體,只要施力存在,上板將持續移動,且當施力移除後,仍與起始位置保有一定的位移。反觀,如果材料是彈性體,上板將移動至機械平衡的位置,且當施力移除後,上板將回到起始位置
   
Figure 3.2a

為了分析結果,我們定義兩個量,剪切應力 σ 和剪切應變 γ。剪切應力 σ 是作用於樣品表面每單位面積的剪切力 (shearing force)。如 Fig. 3.2a 的幾何,則 σ 

(1)
其中,S 是材料的上半部表面面積。剪切應變 γ 
(2)
其中,h 是兩板間距。如果材料是均勻的 (uniform),σ 和 γ 的關係將與樣品大小無關。

如果材料是理想彈性材料 (ideal elastic material or Hookean elastic),應力將正比於應變,即

(3)
其中,是材料常數 (material constant),稱為剪切模數 G (shear modulus)。對於這樣的理想材料,剪切應變 γ(t) 的響應如 Fig. 3.2b 的虛線所示
tt0γ(t) = σ/G = 常數
當 t > t0γ(t) = 0
反觀,如果材料是理想黏滯流體 (ideal viscous fluid or Newtonian fluid),剪切應力將正比於剪切應變的時間導數 γ̇  (time derivative of the shear strain),即
(4)
其中,η 是另一個材料常數,稱為黏度 (或剪切黏度)。對於這樣的材料,應變的響應如 Fig. 3.2c 的虛線所示
當 t < t0γ(t) = (σ/η)t
當 t > t0γ(t) = 常數
對於高分子材料,γ(t) 將更加複雜,如 Figs. 3.2b 和 3.2c 的實線所示。高分子材料通常具有很長的鬆弛時間 (long relaxation times),且在達到穩態之前表現出複雜的暫態行為,材料之複雜時間相依行為是所謂的黏彈性 (viscoelasticity)。

C. 彈性係數 (Elastic Constants)
如果彈性材料所受的形變很小,應力與應變的關係是線性的,且材料的機械性質可完全由彈性常數 (elastic constants) 所表徵。對於均向性材料 (isotropic materials),其具有兩個彈性常數,一個是剪切模數 G (Eq. 3),另一個是體積彈性係數 K (bulk modulus),將於下方介紹。

假設一個材料被額外的壓力 
P 均向地壓縮 (compressed isotropically),造成體積由 V  V (如果 > 0 則 V  < 0; Fig. 3.3a)。如果體積的變化很小,則 將正比於比值 V/V (體積應變;volume strain),可寫成
(5)
其中,K 是體積彈性係數 (為正值)。在 Eq. 5 中的定義,負號的加入使 K 值為正。對於其它種類形變的材料彈性係數,可由 KG 表之。假設一個矩形材料在 z 方向均勻地被拉伸 (stretched uniformly),見 Fig. 3.3c。拉伸比例為 λ (elongational ratio),即 λ Lz'/L(其中,LzLz' 是形變前、後材料在 z 方向的長度)。拉伸應變 𝛜 (elongational strain) 可定義成
(6)
每單位面積施加於上方表面的力稱為拉伸應力 (elongational stress),拉伸應力 σ 和拉伸應變 𝛜 的比值為楊氏模數 E (Young's modulus)
(7)
經證明,楊氏模數可以用 GK 表之
(8)
如果材料是沿著 z 方向被拉伸,它將在 x方向收縮,在 方向的應變被定義為 𝛜x = Lx'/L- 1,而帕松比 υ (Poisson's ratio) 則被定義成
(9)
υ 可以用 G 和 K 表之
(10)
體積彈性係數 K 代表一個均向壓縮材料之回復力,可定義於流體和彈性材料。的大小主要是由材料的密度所決定,而且其值不會因流體轉變成彈性材料後有太大的改變,例如,橡膠和高分子熔體的 K 大約在 1 GPa,與金屬的值相近。

在另一方面,剪切模數 G 代表一個變形的材料回復至原來形狀之力,這種力不存在於流體,但卻存在於彈性材料。當高分子流體具有交聯 (cross-links),剪切模數開始不為零且隨交聯反應增加。

值得注意的是,軟物質之所以具有柔軟度 (softness) 是因為剪切模數小,但前面已經提到,軟物質的體積彈性係數約和金屬的值差不多,且遠大於剪切模數。因此,當討論軟物質的形變時,我們可以假設 K 是無限大,也就是體積的改變並不會在在材料受外力變形的情況下發生,這個假設稱為不可壓縮假設 (incompressible assumption),在一般的應力範圍內 (< 10 MPa),這個假設對於軟物質在流體和彈性狀態是合理的。對於不可壓縮材料,Eq. 8 可近似成
(11)

Figure 3.3

D. 彈性材料之連續體力學 (Continuum Mechanics for Elastic Materials)

D.1. 形變自由能密度 (Free Energy Density of Deformation)
我們接下來討論彈性材料如何受外力而變形。只要系統處於平衡 (equilibrium),材料的機械行為完全由一個形變自由能 (deformation free energy) 函數所表徵。為了定義之,我們選擇一個材料在所有外力被移除 (external forces removed) 的平衡狀態 (equilibrium state) ,並定義此狀態為參考狀態 (reference state)。我們接著定義形變狀態 (deformed state) 與參考狀態之自由能差值為形變自由能。在參考狀態每單位體積的形變自由能稱為形變自由能密度 (deformation free energy density)。

在討論形變自由能的明確表示式之前,我們先詳細說明材料的形變。

Figure 3.4

D.2. 正交形變 (Orthogonal Deformation)
最剪單的形變例子是正交形變,如 Fig. 3.4a 所示,一個立方體的材料沿著三個正交的方向被拉伸 λ1λ2、λ倍,造成原來在 (rxry, rz) 的點位移至新的位置
(12)
若讓 f(λ1λ2λ3) 為此形變對應的形變自由能密度 (簡化成 f(λi)),對於均向材料,如要計算材料受外力的形變,f(λi) 是我們唯一必需知道的量。

D.3. 均勻形變 (Uniform Deformation)
彈性材料的形變可以由對應關r → r'(r) 所描述 (mapping),其中 r 和 r' 是形變發生前後,材料點 (material point) 的位置 (點隨材料移動)。如果 r' 是 r 的線性轉換 (linear transformation),r可寫成
(13)
E 是常數張量 (constant tensor)。因為材料所有的體積單元 (volume elements) 以同樣的方式形變 (deformed in the same way),所以稱為均勻形變。如果以希臘字母當下標 αβγ 表示向量和張量的 x, y, z 分量,並採用 Einstein 表示法 (Einstein notation),則 Eq. 13 可寫成
(14)
Equation 14 中的 E 稱為形變梯度張量 (deformation gradient tensor),因為 可以寫成
(15)
形變 E 所對應的自由能變化量 f(E) 可以用 f(λi) 來表示。

D.4. 通用形變 (General Deformation)

通用形變所對應的形變自由能可以從 f(E) 計算得到。如 Fig. 3.4c 所示,任何的形變可表示成 r → r'r'(r),屬非線性的對應 (nonlinear mapping),然而,局部的形變 (local deformation) 總是均勻的,因為一個小向量 drα (small vector) 總是對應到 drα= (rα'/rβ)drβ (例如,在分量 xdrx= (rx'/rx)dr(rx'/ry)dry + (rx'/rz)drz)。在點 r 的形變梯度張量為 Eαβ(r) = rα'/rβ (Eq. 15),因此,形變自由能之總和為 (total free energy of deformation)
(16)
我們透過適當的邊界條件可以讓 Ftot 最小化得到材料的平衡狀態 (equilibrium state)。

平衡狀態亦可透過考慮材料的力平衡 (force balance) 取得。這個方法較為通用的原因是因為它可以解釋黏滯應力 (viscous stress),反觀,黏滯應力無法從自由能引伸出來。



Reference: M Doi, Soft Matter Physics (Oxford University Press 2013).

2019年12月1日

Boltzmann's 疊加原理 (Boltzmann's Superposition Principle)

著名的 Maxwell 模型是一個現象學模型 (phenomenological model),其表示式如下
(1)
(2)
事實上,Eq. 1 可由一個更正式的論證推得,即 Boltzmann's 疊加原理 (Boltzmann's superposition principle)。它假設當前時間 t 的應力,是由一個較早時間 t' 的步階應變 λ(t') (step strain) 所造成,當前時間 t 的應力將線性正比於應變 λ(t'),且比例常數 (proportionality),即模數 (modulus),隨時間間距 t - t' 拉大而變小。這個模數是 t - t' 的衰減函數,表示成 G(t - t')。

若考慮一個系統,在過去不同時間點 (t1, t2, ...) 歷經很多小的步階應變 (step strains),根據 Boltzmann's 疊加原理,所有小應變對應的應力將彼此獨立 (independent)。因此,當前時間 t 的總應力 (total stress) 是這些應力之總和
(3)
其中,λ(ti) 是於 t< t 施加的小步階應變。我們可以把過去的應變歷史視為所有小應變之總和,且每個小應變均發生於非常短的時間間距。因此,Eq. 3 可寫成
(4)
在極限 t' 0,Eq. 4 可以寫成等同於 Eq. 1 的積分型式 (integration form)。

因此,我們可以使用廣義化的現象學 Maxwell 模型,或者 Boltzmann's 疊加原理得到描述線性黏彈行為 (linear viscoelastic behavior) 的基礎方程式 (Eq. 1 或 2)。

事實上,所有線性黏彈性質都與 G(t) 有關連。例如,於穩態剪切流下,剪切率 λ0_dot 為一常數,因此,Eq. 1 可寫成
(5, 6)
 由於黏度 η = - σ/λ0_dot,所以
(7)
在步階應變應力鬆弛實驗 (step-strain stress relaxation experiment; Fig. 4.5),時間相依的應力鬆弛 (time-dependent stress relaxation) 可以寫成
(8)
 使用 L'hospital rule 於 Eq. 8,可得
Figure 4.5


Reference: YH Lin, Polymer Viscoelasticity: Basics, Molecular Theories and Experiments (World Scientific 2003).