N체 시뮬레이션
N-body simulation물리학과 천문학에서 N-체 시뮬레이션은 입자의 동적 시스템을 시뮬레이션하는 것으로, 보통 중력과 같은 물리적 힘의 영향을 받는다(다른 응용 분야에 대한 n-체 문제 참조).N-물체 시뮬레이션은 지구-달-태양계와 같은 소수의 물체 시스템의 역학 조사에서부터 우주의 [1]대규모 구조의 진화를 이해하는 것까지 천체 물리학에서 널리 사용되는 도구입니다.물리 우주론에서, N-체 시뮬레이션은 은하 필라멘트와 은하 할로스와 같은 비선형 구조 형성 과정을 암흑 물질의 영향으로부터 연구하기 위해 사용됩니다.직접적인 N-체 시뮬레이션은 성단의 동적 진화를 연구하는 데 사용된다.
입자의 성질
시뮬레이션에 의해 처리되는 '입자'는 미립자 상태의 물리적 물체에 해당할 수도 있고 그렇지 않을 수도 있다.예를 들어, 별 성단의 N-체 시뮬레이션은 별당 입자를 가질 수 있으므로 각 입자는 어느 정도 물리적 의미를 가집니다.반면, 가스 구름의 시뮬레이션은 물질의 각 몰에 대해 10개의 입자를23 필요로 하기 때문에(아보가드로 상수 참조), 따라서 단일 '입자'는 훨씬 더 많은 양의 가스를 나타낼 수 있습니다(흔히 매끄러운 입자 유체역학을 사용하여 구현됨).이 수량은 물리적인 의미가 있을 필요는 없지만 정확성과 관리 가능한 컴퓨터 요건 사이에서 절충하여 선택해야 합니다.
직접 중력 N-체 시뮬레이션
직접 중력 N-체 시뮬레이션에서, 상호 중력의 영향을 받는 N개의 입자로 이루어진 시스템의 운동 방정식은 어떠한 근사치도 단순화하지 않고 수치적으로 통합된다.이러한 계산은 별이나 행성과 같은 개별 물체 간의 상호작용이 시스템의 진화에 중요한 상황에서 사용됩니다.
최초의 직접 중력 N-체 시뮬레이션은 1941년 룬드 천문대에서 에릭 홀엠버그에 의해 수행되었고, 빛의 전파와 중력 상호작용 사이의 수학적 등가성을 통해 은하와 마주치는 별들 사이의 힘을 알아냈습니다: 별의 위치에 전구를 놓고 방향 l을 측정합니다.광전지에 의해 별의 위치에 플럭스가 흐르면 운동방정식은 O O[2] 과 통합될 수 있습니다.최초의 순수 계산 시뮬레이션은 독일 하이델베르크에 있는 천문 연구소에서 세바스찬 폰 호어너에 의해 수행되었다.영국 케임브리지 대학의 Sverre Aarseth는 적응형(계층적) 시간 단계, 아마드-코헨 인접 관계 체계 및 근접 조우 규칙화를 사용하는 천체물리학적 응용 프로그램을 위한 고효율 N-바디 코드 개발에 그의 모든 과학 인생을 바쳤습니다.정규화는 서로 임의로 근접한 두 입자에 대한 뉴턴의 중력 법칙에서 특이점을 제거하기 위한 수학적인 속임수이다.스베레 아르세스의 코드는 성단, 행성계, 은하핵의 [citation needed]역학을 연구하는 데 사용됩니다.
일반상대성이론 시뮬레이션
많은 시뮬레이션이 충분히 커서 프리드만-레미트레-로버트슨-워커 우주론을 확립할 때 일반상대성이론의 효과가 중요하다.이는 결합 좌표계에서 거리(또는 스케일 팩터)의 진화하는 척도로 시뮬레이션에 통합되어 입자가 결합 좌표에서 느려지도록 합니다(물리적 에너지의 적색 편이 때문에).그러나 일반적인 동적 타임스케일이 시뮬레이션용 광교차시간에 비해 길고 입자에 의해 유도되는 시공간 곡률 및 입자속도가 작기 때문에 일반상대성이론과 한정된 중력속도의 기여는 무시할 수 있다.이러한 우주론적 시뮬레이션의 경계 조건은 일반적으로 주기적(또는 트로이덜)이므로 시뮬레이션 부피의 한쪽 가장자리가 반대쪽 가장자리와 일치합니다.
계산 최적화
N-체 시뮬레이션은 뉴턴 중력의 입자 운동을 정의하는 6N 상미분 방정식을 통합하는 것만을 수반하기 때문에 원칙적으로 간단하다.실제로 관련된 입자의 수 N은 보통 매우 크고(일반적인 시뮬레이션은 수백만 개를 포함, 밀레니엄 시뮬레이션은 100억 개를 포함), 그리고 계산되어야 하는 입자-입자 상호작용의 수는 N의 순서로2 증가하며, 따라서 미분 방정식의 직접적인 통합은 엄청나게 계산될 수 있다.비용이 많이 듭니다.따라서 여러 가지 개선 사항이 일반적으로 사용됩니다.
수치 적분은 보통 도약 적분 등의 방법을 사용하여 작은 시간 단계에 걸쳐 수행됩니다.그러나 모든 수치 통합은 오류를 초래합니다.스텝이 작을수록 에러는 적어지지만 실행 속도는 느려집니다.Leapfrog 통합은 시간 단계에서 대략 2차이며, Runge-Kutta 방법과 같은 다른 적분자는 4차 정확도 이상을 가질 수 있습니다.
가장 간단한 개선사항 중 하나는 각 입자가 자신의 시간 단계 변수를 가지고 다닌다는 것입니다. 따라서 매우 다른 동적 시간을 가진 입자가 가장 짧은 시간으로 모두 앞으로 진화하지 않아도 됩니다.
그러한 시뮬레이션을 위한 계산 시간을 줄이기 위한 두 가지 기본적인 근사 방법이 있다.따라서 정확도가 저하되어도 계산의 복잡성을 O(N log N) 이상으로 줄일 수 있습니다.
트리 메서드
반즈 같은 트리 방식에서는HUT 시뮬레이션은 일반적으로 부피를 입방 셀로 분할하기 위해 사용되며, 인근 셀의 입자 사이의 상호작용만 개별적으로 처리하면 된다. 먼 셀의 입자는 먼 셀의 질량 중심에 중심을 둔 단일 큰 입자(또는 낮은 차수의 다극 확장)로 일괄적으로 처리될 수 있다.이를 통해 계산해야 하는 입자 쌍 상호작용의 수를 크게 줄일 수 있습니다.시뮬레이션이 입자-입자 상호 작용을 계산하여 과도한 시뮬레이션을 방지하려면 셀당 많은 입자를 포함하는 시뮬레이션의 밀도가 높은 부분에서 셀을 더 작은 셀로 미세 조정해야 합니다.입자가 균등하게 분포되지 않은 시뮬레이션의 경우, Callahan과 Kosaraju의 잘 분리된 쌍 분해 방법은 고정 치수로 반복당 최적의 O(n log n) 시간을 산출합니다.
입자 메쉬법
또 다른 가능성은 메쉬 위에 공간을 디스포트하고 중력전위 계산을 위해 메쉬 주변의 2x2 정점 사이에 파티클이 분할된다고 가정하는 파티클 메쉬 방법이다.포아송 방정식이 존재하기 때문에 위치 에너지 δ를 찾는 것은 쉽습니다.
여기서 G는 뉴턴 상수이고({})는 밀도(메쉬 포인트의 입자 수)이며, 고속 푸리에 변환을 사용하여 푸아송 방정식이 단순한 형태를 갖는 주파수 영역으로 이동하는 것은 간단한 문제입니다.
서 k {\은 결합 파형 번호이고 모자는 푸리에 변환을 나타냅니다.g - { displaystyle {{ } = - { \ { } 、 i k { \ - i { kcomputing computing computing computing computing computing computing ( \ displaystyle - i { k}}}}}} computing computing computing computing computing computing computing computing computing computing computing computing computing computing the or the or the or or or or or or or transform transform transform transform transform transform or transform transform transform transform transform transform transform transform이 방법은 메쉬 크기에 의해 제한되기 때문에 실제로는 작은 메쉬 또는 기타 기술(트리 또는 단순한 입자 알고리즘과의 결합 등)을 사용하여 작은 크기의 힘을 계산한다.때로는 적응형 메쉬가 사용되기도 하는데, 이 경우 메쉬 셀은 시뮬레이션의 밀도가 높은 영역에서 훨씬 더 작습니다.
특수 케이스 최적화
몇 가지 다른 중력 섭동 알고리즘은 태양계 내 물체의 경로에 대한 꽤 정확한 추정치를 얻기 위해 사용된다.
사람들은 종종 위성을 동결 궤도에 올려놓기로 결정한다.지구 주위를 도는 위성의 궤도는 지구 중심을 도는 2체 타원궤도에서 시작해 지구의 편평도, 태양과 달의 중력, 대기 항력 등으로 인한 작은 보정을 더해 정확하게 모델링할 수 있다.위성의 실제 경로를 계산하지 않고도 얼어붙은 궤도를 찾는 것이 가능하다.
작은 행성, 혜성, 또는 장거리 우주선의 경로는 종종 태양 주위의 2체 타원 궤도에서 시작하여 알려진 궤도에서 더 큰 행성들의 중력에서 작은 보정을 더하여 정확하게 모델링할 수 있습니다.
입자 시스템의 장기 경로의 일부 특성은 직접 계산할 수 있습니다.특정 입자의 실제 경로는 중간 단계로 계산할 필요가 없습니다.이러한 특성에는 랴푸노프 안정성, 랴푸노프 시간, 에르고드 이론의 다양한 측정 등이 포함됩니다.
이입자계
전형적인 시뮬레이션에는 수백만 또는 수십억 개의 입자가 있지만, 그것들은 일반적으로 태양9 질량이 10개인 매우 큰 실제 입자에 해당합니다.이것은 2입자 쌍성계의 형성과 같은 입자 사이의 단거리 상호작용의 문제를 야기할 수 있다.이 입자들은 많은 양의 암흑 물질 입자 또는 별의 그룹을 나타내도록 의도되어 있기 때문에, 이 쌍성은 비물리적입니다.이를 방지하기 위해 연화된 뉴턴 힘의 법칙이 사용되는데, 이 법칙은 짧은 거리에서 역제곱 반지름으로 분산되지 않습니다.대부분의 시뮬레이션은 한정된 크기의 셀에서 시뮬레이션을 실행함으로써 이를 매우 자연스럽게 구현합니다.입자가 항상 스스로 소멸력을 발휘하도록 이산화 절차를 실행하는 것이 중요하다.
연화
연화(softening)는 입자가 다른 입자에 너무 가까이 왔을 때(그리고 힘이 무한대에 도달했을 때) 수치 분산을 방지하기 위해 N-body 기술에 사용되는 숫자 트릭입니다.이것은 각 입자의 정규화된 중력 퍼텐셜을 수정함으로써 얻어진다.
(1/r이 아닌) 은 연화 파라미터입니다.연화 파라미터의 값은 시뮬레이션을 현실적으로 유지할 수 있도록 충분히 작게 설정해야 합니다.
바리온, 렙톤 및 광자를 시뮬레이션에 통합
많은 시뮬레이션은 차가운 암흑 물질만을 시뮬레이션하기 때문에 중력만을 포함합니다.바리온, 렙톤 및 광자를 시뮬레이션에 통합하면 복잡성이 극적으로 증가하며 종종 기초 물리학의 근본적인 단순화가 이루어져야 한다.하지만, 이것은 매우 중요한 영역이고 많은 현대 시뮬레이션은 현재 은하 형성이 진행되는 동안 일어나는 과정을 이해하려고 노력하고 있으며, 이는 은하 편향의 원인이 될 수 있습니다.
계산의 복잡성
Reif와[3] Tate는 n개의 물체가 고정된 정전위 법칙을 만족하는 경우 n개의 물체가 폴리(n)비트의 정확도가 필요하고 목표 시간이 폴리(n)인 주어진 시간 내에 목적지에 도달하는지 여부를 판단하는 것이 PSPACE에 있음을 증명한다.
한편, 본체가 최종적으로 데스티네이션 볼에 도달하는지가 문제라면, 문제는 PSPACE-hard입니다.이러한 경계는 광선 추적을 위해 얻은 유사한 복잡도 경계를 기반으로 합니다.
시뮬레이션 예시
공통 보일러 플레이트 코드
N-body 시뮬레이션의 가장 간단한 구현으로, 여기서 3 n 3)은 궤도를 도는 물체의 순진한 전파이며, 순진한 것은 궤도상에 있는 물체에 작용하는 유일한 힘이 서로 작용하는 중력임을 암시한다.C++와 같은 객체 지향 프로그래밍 언어에서 일부 보일러 플레이트 코드는 기본적인 수학적 구조뿐만 아니라 전파에 필요한 데이터 컨테이너, 즉 상태 벡터, 벡터 및 이 데이터를 포함하는 일부 기본 객체 및 궤도를 도는 물체의 질량을 확립하는 데 유용하다.이 방법은 다른 유형의 N-체 시뮬레이션에도 적용할 수 있다. 전하가 있는 점 질량의 시뮬레이션은 유사한 방법을 사용할 수 있지만 힘은 전기장의 상호작용에 의한 인력이나 반발에 기인한다.그럼에도 불구하고 입자의 가속도는 입자의 질량으로 나눈 합산된 힘 벡터의 결과이다.
입자의 운동학적 데이터를 포함하는 프로그램적으로 안정적이고 확장 가능한 방법의 예는 최적화된 코드로 메모리 할당과 소비된 자원의 예측을 용이하게 하는 고정 길이 배열을 사용하는 것이다.C++ 에서는, 이것은 사소한 것입니다.
구조 벡터 3 { 이중으로 하다 e[3] = { 0 }; 벡터 3() {} ~벡터 3() {} 인라인 벡터 3(이중으로 하다 e0, 이중으로 하다 e1, 이중으로 하다 e2) { 이것.->e[0] = e0; 이것.->e[1] = e1; 이것.->e[2] = e2; } }; 구조 오비탈 엔티티 { 이중으로 하다 e[7] = { 0 }; 오비탈 엔티티() {} ~오비탈 엔티티() {} 인라인 오비탈 엔티티(이중으로 하다 e0, 이중으로 하다 e1, 이중으로 하다 e2, 이중으로 하다 e3, 이중으로 하다 e4, 이중으로 하다 e5, 이중으로 하다 e6) { 이것.->e[0] = e0; 이것.->e[1] = e1; 이것.->e[2] = e2; 이것.->e[3] = e3; 이것.->e[4] = e4; 이것.->e[5] = e5; 이것.->e[6] = e6; } };
주의:OrbitalEntity
에는 상태 벡터를 저장할 수 있는 충분한 공간이 있습니다.
0 {}= [ 0에 따른데카르트 공간의 객체 위치 벡터 투영
1 (\1}= [0에 따른 데카르트 공간의 객체 위치 벡터 투영
2 {}= [ 0에 따른 데카르트 공간의 객체 위치 벡터 투영
3 ({3}={ [ 0 에 따른 데카르트 공간의 물체 속도 벡터 투영
4 { _ { 4 } ={ }、 [ \left [ \ ; \ ; \ ])에 따른데카르트 공간의 물체 속도 벡터 투영
5 {5}={ [ 0에 따른 데카르트 공간의 물체 속도 벡터 투영
또한.OrbitalEntity
에는 질량 값을 저장할 충분한 공간이 있습니다.
시뮬레이션 파라미터의 초기화
일반적으로 N-body 시뮬레이션은 일부 유형의 운동 방정식에 기반한 시스템입니다. 이들 중 대부분은 시뮬레이션을 "시드"하기 위해 일부 초기 구성에 의존합니다.어떤 중력이나 전위에 의존하는 시스템과 같은 시스템에서 시뮬레이션 실체에 대한 힘은 속도에 따라 독립적입니다.따라서 시뮬레이션의 힘을 증가시키기 위해서는 초기 위치만 있으면 되지만, 이는 전파를 허용하지 않는다. 초기 속도가 필요하다.항성 주위를 도는 행성을 생각해 봅시다. 이 행성은 움직임은 없지만, 모항성에 대한 중력의 영향을 받습니다.시간이 경과하고 시간 스텝이 추가되면 가속도에 따라 속도가 증가합니다.주어진 tn({ t_ 인접 질량에 의한 물체의 가속도는 속도와 무관하지만 t +({ 시간 에서는 전파의 본질적인 벨로에 의존하기 때문에 위치의 변화가 현저하게 다르다.도시. 아래에 사용될 심플렉틱 오일러 방법과 같은 기본적인 전파 메커니즘에서, n +({에서의 물체의 위치는 n에서의 속도에만 의존하며, 이는 위치 이동이 다음을 통해 계산되기 때문이다.
가속이 없으면 v n은 정적이지만, 관측자가 위치만 보는 관점에서 속도 변화를 확인하려면 두 가지 시간 단계가 필요합니다.
태양계 같은 시뮬레이션은 중심별에서 행성 등가점 질량의 평균 거리를 취함으로써 달성될 수 있다.코드를 단순하게 유지하기 위해 반장축 및 평균 속도에 기초한 비강성 접근법을 사용한다.이러한 바디의 메모리 공간은 바디를 설정하기 전에 예약해야 합니다.확장성을 확보하기 위해 malloc 명령을 사용할 수 있습니다.
오비탈 엔티티* orbital_interval; orbital_interval = (오비탈 엔티티*)마로크(크기(오비탈 엔티티) * (9 + N_ASTEROIDs)); orbital_interval[0] = { 0.0,0.0,0.0, 0.0,0.0,0.0, 1.989e30 }; // 태양과 비슷한 별 orbital_interval[1] = { 57.909e9,0.0,0.0, 0.0,47.36e3,0.0, 0.33011e24 }; // 수성과 비슷한 행성 orbital_interval[2] = { 108.209e9,0.0,0.0, 0.0,35.02e3,0.0, 4.8675e24 }; // 금성과 비슷한 행성 orbital_interval[3] = { 149.596e9,0.0,0.0, 0.0,29.78e3,0.0, 5.9724e24 }; // 지구와 비슷한 행성 orbital_interval[4] = { 227.923e9,0.0,0.0, 0.0,24.07e3,0.0, 0.64171e24 }; // 화성과 비슷한 행성 orbital_interval[5] = { 778.570e9,0.0,0.0, 0.0,13e3,0.0, 1898.19e24 }; // 목성과 비슷한 행성 orbital_interval[6] = { 1433.529e9,0.0,0.0, 0.0,9.68e3,0.0, 568.34e24 }; // 토성과 비슷한 행성 orbital_interval[7] = { 2872.463e9,0.0,0.0, 0.0,6.80e3,0.0, 86.813e24 }; // 천왕성과 비슷한 행성 orbital_interval[8] = { 4495.060e9,0.0,0.0, 0.0,5.43e3,0.0, 102.413e24 }; // 해왕성과 비슷한 행성
어디에N_ASTEROIDS
변수는 일시적으로 0으로 유지되지만 사용자의 재량에 따라 향후 상당한 수의 소행성을 포함할 수 있습니다.시뮬레이션 설정의 중요한 단계는 시뮬레이션의 시간 t0 ~ n { style _ } 시뮬레이션을 진행하는 증분 시간 d \ style 를 설정하는 것입니다.
이중으로 하다 t_0 = 0; 이중으로 하다 t = t_0; 이중으로 하다 dt = 86400; 이중으로 하다 t_end = 86400 * 365 * 10; // 약 10년(초) 이중으로 하다 빅_G = 6.67e-11; // 중력 상수
위에서 설정한 위치 및 속도는 t 0{\ t에 대해 올바른 것으로 해석됩니다.
시뮬레이션의 범위는 논리적으로 t t < n \ t _ { } \ < t _ { } 입니다.
전파
전체 시뮬레이션은 수백, 수천, 수백만, 수십억 또는 때로는 수조 단계의 시간 단계로 구성됩니다.기초 수준에서, 각 시간 단계(입자가 작용하는 힘에 의해 움직이는 시뮬레이션의 경우)는 다음을 포함한다.
- 각 물체에 가해지는 힘을 계산하는 것
- 차체의 가속도를 계산합니다{\
- 각 물체의 속도 계산( v - + { { { } = } { n - 1 } + { \ { a { } )
- 각 본체의 위치 + r → + n { { { { + } = { { \ { { } )
위의 내용은 위의 범위 내에t\t가 하는 동안에도 잠시 루프가 계속됨으로써 매우 간단하게 구현할 수 있습니다.
하는 동안에 (t < > t_end) { 위해서 (size_t m1_idx = 0; m1_idx < > 9 + N_ASTEROIDs; m1_idx++) { 벡터 3 a_g = { 0,0,0 }; 위해서 (size_t m2_idx = 0; m2_idx < > 9 + N_ASTEROIDs; m2_idx++) { 한다면 (m2_idx != m1_idx) { 벡터 3 r_module; r_module.e[0] = orbital_interval[m1_idx].e[0] - orbital_interval[m2_idx].e[0]; r_module.e[1] = orbital_interval[m1_idx].e[1] - orbital_interval[m2_idx].e[1]; r_module.e[2] = orbital_interval[m1_idx].e[2] - orbital_interval[m2_idx].e[2]; 이중으로 하다 r_mag = sqrt(r_module.e[0] * r_module.e[0] + r_module.e[1] * r_module.e[1] + r_module.e[2] * r_module.e[2]); 이중으로 하다 액셀러레이션 = -1.0 * 빅_G * (orbital_interval[m2_idx].e[6]) / 전원(r_mag, 2.0); 벡터 3 r_unit_module(유닛_module) = { r_module.e[0] / r_mag,r_module.e[1] / r_mag,r_module.e[2] / r_mag }; a_g.e[0] += 액셀러레이션 * r_unit_module(유닛_module).e[0]; a_g.e[1] += 액셀러레이션 * r_unit_module(유닛_module).e[1]; a_g.e[2] += 액셀러레이션 * r_unit_module(유닛_module).e[2]; } } orbital_interval[m1_idx].e[3] += a_g.e[0] * dt; orbital_interval[m1_idx].e[4] += a_g.e[1] * dt; orbital_interval[m1_idx].e[5] += a_g.e[2] * dt; } 위해서 (size_t entity_idx = 0; entity_idx < > 9 + N_ASTEROIDs; entity_idx++) { orbital_interval[entity_idx].e[0] += orbital_interval[entity_idx].e[3] * dt; orbital_interval[entity_idx].e[1] += orbital_interval[entity_idx].e[4] * dt; orbital_interval[entity_idx].e[2] += orbital_interval[entity_idx].e[5] * dt; } t += dt; }
시뮬레이션에서 내부 4개의 암석 행성에 초점을 맞추면 위의 전파로 인한 궤적은 다음과 같습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ Trenti, Michele; Hut, Piet (2008). "N-body simulations (gravitational)". Scholarpedia. 3 (5): 3930. Bibcode:2008SchpJ...3.3930T. doi:10.4249/scholarpedia.3930. Retrieved 25 March 2014.
- ^ Holmberg, Erik (1941). "On the Clustering Tendencies among the Nebulae. II. a Study of Encounters Between Laboratory Models of Stellar Systems by a New Integration Procedure". The Astrophysical Journal. 94 (3): 385–395. Bibcode:1941ApJ....94..385H. doi:10.1086/144344.
- ^ John H. Reif; Stephen R. Tate (1993). "The Complexity of N-body Simulation". Automata, Languages and Programming. Lecture Notes in Computer Science. pp. 162–176. CiteSeerX 10.1.1.38.6242.
추가 정보
- von Hoerner, Sebastian (1960). "Die numerische Integration des n-Körper-Problemes für Sternhaufen. I". Zeitschrift für Astrophysik (in German). 50: 184. Bibcode:1960ZA.....50..184V.
- von Hoerner, Sebastian (1963). "Die numerische Integration des n-Körper-Problemes für Sternhaufen. II". Zeitschrift für Astrophysik (in German). 57: 47. Bibcode:1963ZA.....57...47V.
- Aarseth, Sverre J. (2003). Gravitational N-body Simulations: Tools and Algorithms. Cambridge University Press. ISBN 978-0-521-12153-8.
- Bertschinger, Edmund (1998). "Simulations of structure formation in the universe". Annual Review of Astronomy and Astrophysics. 36 (1): 599–654. Bibcode:1998ARA&A..36..599B. doi:10.1146/annurev.astro.36.1.599.
- Binney, James; Tremaine, Scott (1987). Galactic Dynamics. Princeton University Press. ISBN 978-0-691-08445-9.
- 를 클릭합니다Callahan, Paul B.; Kosaraju, Sambasiva Rao (1992). "A decomposition of multidimensional point sets with applications to k-nearest-neighbors and n-body potential fields (preliminary version)". STOC '92: Proc. ACM Symp. Theory of Computing. ACM..