前の10件 | -

最近のLinux(RHEL9)でWindows XPのファイル共有にアクセスする [電子工作・プログラミング]

仮想マシン (virshによるlibvirt経由のKVM) のWindows XPを、Red Hat Enterprise Linux 9.3で初めて使ったところ、ホストとのWindowsファイル共有が中々できなくて困りました。ポイントは、Windows XPはファイル共有プロトコルがSMB1なことだったようで、以下でLinuxホストからWindows XPクライアントの共有ファイルにアクセスできました。
 $ smbclient --option='client min protocol=NT1' -U ユーザ名 //仮想マシンのアドレス/共有フォルダ名
もしくは、
 /etc/samba/smb.confに "client min protocol = NT1" を追記し、Nautilusの「他の場所」からマウント操作
もしくは、
 # mount -t cifs -o vers=1.0,user=ユーザ名 //仮想マシンのアドレス/共有フォルダ名 マウントポイント

いろいろやったので、本当にこれだけで済むかは分かりませんが、とりあえずメモしておきます。
ちなみに、smbclientのバージョンは4.18.6でした。

2024年2月14日21時31分
fartrip
コメント(0) 

Raspberry Pi OSで無線LANで固定IP接続にしたい [電子工作・プログラミング]

Raspberry Pi関係はWebにたくさん記事があるのですが、過去のバージョンの情報だったりして、中々思う通りに行かないこともあります。さらに、ネットワーク関係のことは、僕の理解の足りなさもあって、どうすれば良いか、結構調べる必要がありました。ので、備忘録としてSDカード作成から書いておきます。

1. Raspberry Pi OSの公式ページの"Manually install an operating system image"から、Raspberry Pi OS Liteをダウンロードする。December 11th 2023版、32-bit、Kernel version: 6.1、Debian version: 12 (bookworm)だった。
2. `dd if=ダウンロードしたimageファイル of=/dev/mmcblk0 bs=1M`で普通にSDカードにイメージを書き込み
3. Raspberry Pi (今回は3A+を使用) にディスプレイ、キーボード、電源を接続して起動。普通にインストールを進める
4. ターミナルでコマンドが打てるようになったら、`sudo raspi-config`でひとしきりの設定をする。特に、5 Location Optionsで、L4 WLAN Countryの設定をする。1 System Optionsから、無線LANのSSIDの設定をする。
5. /etc/NetworkManager/system-connections/SSIDから付けられているID名.nmconnectionを修正する。
6.`sudo nmcli connection reload && sudo nmcli connection up SSIDから付けられているID`で設定ファイルのリロード・更新

以上で何とかできました。5.と6.については、https://raspida.com/nmcli-static-ipaddressを参照し、「Raspberry PiのWi-Fi設定は、新しいbookwormからNetworkManagerになりました」とのこと。世の古い記事では、`/etc/dhcpcd.conf`を編集する旨あるのですが、最新の版のOSでは、そもそもそのファイルが無かったです。

12月16日17時11分
fartrip

コメント(0) 

ヘッドレスのLinux機でGUIを使う [電子工作・プログラミング]

先日、ずっと使っていたPC(CentOS 7)のPCI-Expressが全て故障し、ビデオカードからの出力ができなくなりました。そのため、強制的にヘッドレス機として運用することになり、GUIが必要な作業はtigervncで行っているのですが、CUI環境からでもGUIを要するプログラムを実行する方法として、Xvfb(https://www.x.org/releases/X11R7.6/doc/man/man1/Xvfb.1.xhtml)があることを知ったので、備忘録としてメモします。xvfb-run 一発で実行できるので、良い感じです。

12月30日19時50分
fartrip
コメント(0) 

Windowsでファイル名に(1)のついた大量のファイルから、(1)を外すコマンド [電子工作・プログラミング]

もう少し正確には、「DSC_xxxx (1).JPG」のように、数字だけで決まる単純なフォーマット+" (1)"のファイルが『大量』にあるときに、(1)を外すことを、コマンドプロンプトで行う方法です。僕が必要となったシーンは単純で、デジカメで撮像した大量のファイルを誤ってコピーした際、勝手にリネームされたような場合でした。

【方法(例)】コマンドプロンプトで、以下のコマンドを実行する:
 FOR /L %s IN (150, 1, 850) DO move "DSC_0%s (1).JPG" "DSC_0%s.JPG"

Windowsのコマンドプロンプトの「FOR」コマンドの/Lスイッチを利用して、変数%sに150から850まで、1刻みのテキストを代入し、DO以下のコマンドを実行します。ここでは、(1)付きのファイル名から(1)無しのファイル名にmoveしています。いま、ファイル名にスペースを含むので、ファイル名を二重引用符で囲っています。

いま、ファイル名を決め打ちしているので、1つの命名規則のファイルにしか対応していません。色々な命名規則には対応できない一方、ファイル名を解析してリネームする方法と違って、万一コマンドを間違えたりしても、存在しないファイルをリネームしようとするだけなので、被害が起きにくい利点もあります。

今回のファイルの命名規則は「DSC_xxxx.JPG」のように4桁で、1000以下の数に対しては0埋めされるようになっています。ただ、今回対象の数字は150から850と3桁なので、4桁目を0埋めする必要があります。コマンドプロンプトのバッチの奥義には適切に0埋めする技もあると思うのですが、ここでは単純に"0%s" とすることで、"0150"などの4桁の数字を得ています。

DO以降のコマンドは任意なので、例えば"echo" を実行することで、ファイル名の展開に関する事前のテストが可能ですし、他のコマンドでも何か使いでがある場合があるかもしれません。

8月8日9時55分
fartrip



コメント(0) 

3次元のMaxwell方程式(周波数定常)を有限要素法で解きたくて調べたメモ [電子工作・プログラミング]

3次元のMaxwell方程式(周波数定常)を有限要素法で解きたくて調べたメモ

弱形式
∫( (α∇×E)・(∇×F) - βE・F)dV - ∫(α∇×E)・n dS=∫ f・F dV
但し、α=1/μ、β=εω^2、nは領域外周の外向きのベクトル、fはソース項、Eは電界ベクトル、Fは試行関数ベクトル

離散化
・分割された要素内において、電界ベクトルEを形状関数Niと自由度eiを用いて
E = (N1, N2, ...)・(e1, e2, ...)^T と近似する。

形状関数
・Nedelecエッジ要素 (curl-conforming element) を用いる
・一般の形状を考えるのは大変なので、まず簡単な形状のリファレンス要素で考える。その後、座標変換して望みの形状の要素に対する形状関数を得る

Nedelecエッジ要素の具体的な形
・1次要素は、1辺に1自由度を持つ。簡単な四面体のリファレンス要素(頂点がp0=(0,0,0), p1=(1,0,0), p2=(0,1,0), p3=(0,0,1))のとき、形状関数をηijとすると
η01 = (1-y-z, x, x), η02 = (y, 1-x-z, y), η03 = (z, z, 1-x-y)
η12 = (-y, x, 0), η23 = (0, -z, y), η31 = (z, 0, -x)
確かに全てdivを取ると0になる。また、体積座標λiを用いて、ηij = λi∇λj - λj∇λi とも書ける。

・2次以上の高次要素は簡単には書き下せない。代わりに、別の基底ベクトルの組{φ_j}を考え、各辺・面・領域に対応する自由度に対する条件を満たすよう係数u_jを決め、形状関数η_i=Σu_ij φ_jを求める。四面体に対する2次要素の自由度数は、各辺2自由度、各面2自由度の計20。詳細は文献[1]など参照だが、調べ中。

座標変換
・リファレンス要素における3次元座標をξ、望みの四面体要素における3次元座標をxとするとき、リファレンス要素から望みの四面体要素へのアフィン変換Fは
x = F(ξ) = Bk ξ + bk, 但しBkは3x3の行列、bkは3次元ベクトル
となる。四面体要素の頂点の3次元座標をa0, a1, a2, a3とすると、Bk = (a1-a0, a2-a0, a3-a0)、bk=a0 となる。
・形状関数はベクトルなので、リファレンス要素から座標変換するときにはPiola変換が必要になる。リファレンス要素における形状関数をη(ξ)、望みの四面体要素の形状関数をN(x)とすると
N(x) = (Bk^T)^-1 η(F^-1(x))
となる。
・curlに関する座標変換は
∇×N(x) = 1/det(Bk) Bk ∇×η(F^-1(x))

係数行列の作成
・質量行列 Mij = ∫Ni・Nj dx
・剛性行列 Kij = ∫(∇×Ni)・(∇×Nj) dx
・エッジの向きがあるため、自由度eiにも向きがある。リファレンス要素のエッジの向きと自由度として保持するエッジの向きが逆のときは負号をつける

積分関連
・∫dx = |det(Bk)|∫dξ
・ガウス積分で求める。正確に積分される多項式の次数を2とすると、
三角形:頂点(0,0), (1,0), (0,1)のとき、積分点は(1/2, 0), (0, 1/2), (1/2, 1/2)の3つで、重みは全て1/3×三角形の面積1/2。
四面体:頂点(0,0,0), (1,0,0), (0,1,0), (0,0,1)のとき、積分点は(α, β, β, β), (β, α, β, β), (β, β, α, β), (β, β, β, α)の4つで、重みは全て1/4×四面体の体積1/6。但し、α=0.58541020, β=0.13819660

参考文献
[1] M. Olm, S. Badia and A. F. Martin, Adv. Eng. Softw. 132, 74-91 (2019)
[2] I. Anjam and J. Valdman, Comput. Appl. Math. 267, 252-263 (2015)
[3] Peter Monk, "Finite Element Methods for Maxwell's Equations", Oxford Science Publications, 2003
[4] 小柴正則, 光・波動のための有限要素法の基礎, 森北出版, 1990

間違いなどあればぜひ教えてほしいです。

5月7日23時57分
fartrip

コメント(0) 

CentOS 7のqemu-kvmでパラレルポートが使えない [電子工作・プログラミング]

数年ぶりにvitr-managerから仮想マシンでパラレルポート (ホストのPCIe増設パラレルポートの /dev/parport0 に接続) を使おうと思ったら、" 'isa-parallel' is not a valid device model name "のエラーが出て、起動できませんでした。調べると、CentOS7のqemu-kvmではパラレルポートのサポートが無効化されているようで:https://bugzilla.redhat.com/show_bug.cgi?id=1174145

代わりに入れると良いパッケージもあるようですが、中々上手く行かなかったので、qemuを手元でビルドして使うことにしました。どのページを参考にしたか失念したのですが、qemu-4.2.0.tar.xzをダウンロード・展開して、特別な設定無しにconfigure、make installしてできたqemuを使ったら、パラレルポートを使って無事起動し、仮想マシン内のアプリケーション (パラレルポートのI/Oアドレス0x378を仮定) から正常に動作しました。

・設定したconfigureオプションは'./configure --target-list=x86_64-softmmu --enable-kvm --enable-spice --prefix=/home/user/to/install'
・途中で足りないと言われたdevelパッケージはyumで入れる
・virt-managerで設定した仮想マシンに、手元でビルドして出来たバイナリ 'qemu-system-x86_64' を使うよう設定する方法として、virshを使った。'virsh edit 仮想マシン名' とするとviが起動するので、<emulator>タグにqemu-system-x86_64 のフルパスを入れる。また、<type>タグのmachine属性にチップセットの種類を入れるが、OS付属のqemu-kvmで対応しているmachine( 'pc-i440fx-rhel7.6.0' など)と手元でビルドしたqemuが対応するmachineは違うので、'qemu-system-x86_64 -machine help' で調べるか、単に 'pc' を入力する。
・手元の環境のCentOSのバージョンは7.9.2009だった。

11月30日24時5分
fartrip

2023年5月5日追記
qemuでのコマンドラインオプションは次の通り:
 -parallel /dev/parport0
もしくは、virt-managerが生成したものに沿って:
 -chardev parallel,id=charparallel0,path=/dev/parport0 -device '{"driver":"isa-parallel","chardev":"charparallel0","id":"parallel0"}'
いずれも、qemu 7.2.1のqemu-system-x86_64で動作確認。
コメント(0) 

FreeFEM 4.6 で対称行列をPARDISOで解く [FreeFEM]

FreeFEMはかねてから直接法ソルバーのIntel MKL PARDISOにプラグインで対応しているのですが、細かな対応具合はバージョンでまちまちでした。ただFreeFEM 4.6では行列の対称性としてStructually symmetric以外のPARDISOに入力可能なもの全てに対応していたので、備忘録としてメモします。

1. Linuxであれば、MKLを利用してビルドするとplugin/seq/PARDISO.cpp をビルドしてモジュールを作成してくれる。configureのオプションに--with-mkl=(mklのインストールパス)/linux/mkl/lib/intel64_lin と --enable-mkl-mlt をつければ良い。後者はOpenMP並列化でマルチコアで実行するために必要。Windowsであればプラグインの修正(自作)が必要?
2. edpスクリプト内でvarf lap(u,v)=... として弱形式を記述して、matrix A = lap(Vh,Vh) 等として全体剛性行列を得る。
3. load "PARDISO" を実行した上で、set(A, solver=sparsesolver, sym=xx, positive=xx) としてPARDISOを利用するよう指定した後、x[] = A^-1 * b[] などとして求解できる。

ここで重要なのが、set()の引数のsymとpositive。例によってDocumentationにはまだ記述が見つからず、Exampleのexamples/plugin/PARDISO.edp から使い方を見ました。行列の対称性により、下記の組み合せで指定するようです。

A. 実数非対称 sym=0 もしくはsym省略
B. 実数対称不定値 sym=1, positive=false もしくはpositive省略
C. 実数対称正定値 sym=1, positive=true
D. 複素数非対称 sym=0 もしくはsym省略
E. 複素数エルミート不定値 sym=1, positive=false もしくはpositive省略
F. 複素数エルミート正定値 sym=1, positive=true
G. 複素数対称非エルミート sym=2

特にsym=2の記述は別のサンプル(examples/ffddm/Helmholtz-3d-simple.edp)でようやく見つけました。

非対称(sym=0)のときは、行列Aをわざわざ明示的に作成しなくても、solve lap(u,v,solver=sparsesolver)=... などとしてもPARDISOで解くことができます。またproblem, solveのinit引数も有効で、例えばsolve lap(u,v,solver=sparsesolver, init=1)=... とすれば、最初の1回のみfactorization含め全て行い (phase 1-3)、以降は行列部分の再評価無しにsolveのみ (phase 3) を行ってくれます。

また、verbosityを5以上に上げればPARDISOに渡す引数のmsglvl=1となり、進捗や所要時間、使用コア数等の情報を印字してくれます。

速度はMUMPSとどっこいですが、メモリ使用量は気持ち少ないようです。MKLは無料で入手でき、MUMPSと違いMPIと関わらないことから、ビルドさえ成功すれば気軽に利用できる直接法ソルバーと思います。

11月26日20時3分
fartrip

コメント(0) 

FreeFEM 4.6 でMUMPSで並列計算で求解する [FreeFEM]

FreeFEMのDocumentationのMUMPSに関する記述は (少なくともRelease4.6では) 古いモジュール "MUMPS_FreeFem" に関するものなので、最新のモジュール "MUMPS" の使い方はExample (examples/mpi/MUMPS.edp) を参照すること、という話。

varf lap(u,v) = ... として弱形式を記述して、matrix A = lap(Vh,Vh) 等として全体剛性行列を得る。このあと、load "MUMPS" を実行した上でset (A, solver=sparsesolver, master=xx) とすればソルバーとして直接法のMUMPSを使用するよう設定でき、x[] = A^-1 * b[] 等として求解できる。逐次版でもOpenMPを用いた並列化 (少なくともWindows版の"MUMPS_seq"ではそのようにビルドされているよう) でマルチコアで計算できるし、MPI版ならもちろん並列で求解できる。

ただMPI版で気になるのが、全体剛性行列はどのような値が用いられるのか。結論としては、set()の引数masterの値で動作を切り換えられる。

1) master=0の場合 (centralized)
係数行列はランク0のプロセスの行列Aの値を使う。他のプロセスの値は使用しない。このとき、MUMPSにはICNTL(18)=0 (the input matrix is centralized on the host) が与えられる。また、連立一次方程式の右辺bも同様に、ランク0のプロセスで与えた値を用いる。解xもランク0のプロセスのみが持つ。
つまり、ランク0が逐次版と全く同様に動作するように作成しておけば、求解部分のみを並列計算で行ってくれる。シンプル。

2) master=-1の場合 (distributed)
係数行列は全てのプロセスの (ローカルな) 行列Aの値の総和となる。このとき、MUMPSにはICNTL(18)=3 (user directly provides the distributed matrix, pattern and entries, ...) が与えられる。また、連立一次方程式の右辺bも同様に、全プロセスの値の合計を用いる (FreeFEMのプラグイン側でMPI_Reduceで求めてMUMPSに渡す)。解xも全てのプロセスにブロードキャストされる。

Example中のdistributed版では、change(Th, fregion=nuTriangle%mpisize) でregion番号をプロセス数を上限とする番号に付け直し、int2d(Th, mpirank) (...) としてregion番号が自分のランクと等しい要素のみをローカルな行列Aに計算している。FreeFEM側で各プロセスは自分の持ち分のみ行列要素を計算し、それを足し合わせる処理はMUMPSに任せていることになる。なるほど。

他にもMUMPSのset() のオプションにはstrategy, rinfoやinfoなどがあるようだけど、そちらは未調査です。

※以上、FreeFEM v4.6時点の話です。次にAPIが大変更されるまでは適用可能と思いますが。

参考:plugin/mpi/MUMPS.cpp
MUMPS Documentation

11月23日 17時10分
fartrip




コメント(0) 

11年 [日記]

ふと思い立って、ずいぶん前にニコ動に登録したまま放置していたAbyss in Heavenを観まして。観終わってマイリス登録の日付を見たら、2009年08月11日でした。

何と。

2020年3月27日25時58分
fartrip

コメント(0) 

gmshで有限要素法用のメッシュを作るときのTips [電子工作・プログラミング]

昔は直方体一つ作るにも随分な作業量が必要で必要でしたが、ver.3からOpenCASCADE kernelが使えるようになり、boxコマンド一発で直方体が作れるようになりました。
GUIはSalomeなどの方が親切なようですが、いったん出来上がったモデルの寸法をコマンドラインから変えたりできてそれはそれで便利なので、gmshを少しだけ使ってみました。
そこで、使う上で便利(というかまともなユーザビリティを得るために必要)と思ったことをメモします。

☆いくつかの要素が一体に形成されたメッシュが欲しい
 → Box, Cylinderなどを配置した後、最後にCoherence; もしくはBooleanFragmentsを行う。
   今回使ってみようと思った動機であり、各要素の重なった面・領域で分割をしつつ重複した面を結合し、一体の結合した領域が得られる。

☆境界や領域の番号を見たい
 → Tools->Options->Geometry->Visibility->Surface labelsやCurve labelsのチェックをONにする。Label typeをElementary tagsにする。

☆境界番号の文字が小さくて見えない!
 → Tools->Options->General->Aspect->Default fontの値を大きくする

☆境界番号の文字の色が見えない!
 → Tools->Options->Geometry->Color の中の色を変更する。SurfaceやVolumesを変えたいことが多いと思う。

☆コンソールの文字が小さい!
 → 起動時、gmsh -fontsize 18などとする

☆立体をどの面からみているか分からなくなった
 → Tools->Options->General->Aspect->Projection mode をperspectiveにする

☆メッシュの向きを知りたい
 → メッシュ作成した後、Tools->Options->Mesh->Visibility->Normals and tangentsの値を大きくする

等々。気付いたら追記していきたいと思います。

11月15日21時37分
fartrip

コメント(0) 
前の10件 | -

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。